Linux网络编程【高并发服务器_tcp聊天室简单模型】
在做这个模型之前 最难的是两台主机之间建立连接互相ping通①、设置虚拟机网络适配器为桥接模式②、获取主机的IP地址、默认网关、子网掩码③、虚拟网络编辑器
·
在做这个模型之前 最难的是两台主机之间建立连接互相ping通
①、设置虚拟机网络适配器为桥接模式
②、获取主机的IP地址、默认网关、子网掩码
③、虚拟网络编辑器
这里的桥接至应该与主机一致
④、设置虚拟机桥式连接
保证主机和虚拟机在同一个网段中
【注意】如果虚拟机与主机ping失败,关闭防火墙并且设置ICMP
点击入站规则
开启这两个服务
最后多线程服务器的代码如下
#include "wrap.h"
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#define SERPORT 9999
void catch_child(int signo)
{
if(signo == SIGCHLD)
while((waitpid(0, NULL, WNOHANG)) > 0);
}
int main(int argc, char *argv[])
{ socklen_t cli_addr_len;
struct sockaddr_in ser_addr, cli_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(SERPORT);
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
pid_t pid;
int lfd, cfd;
int ret;
char buf[BUFSIZ];
lfd = socket(AF_INET, SOCK_STREAM, 0);
bind(lfd, (struct sock_addr *)&ser_addr, sizeof(ser_addr));
listen(lfd, 128);
cli_addr_len = sizeof(cli_addr);
while(1) {
cfd = accept(lfd, (struct sockaddr *)&cli_addr, &cli_addr_len);
pid = fork();
if(pid == 0) {
close(lfd);
break;
}else if(pid > 0) {
close(cfd);
struct sigaction act, oldact;
act.sa_handler = catch_child;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
ret = sigaction(SIGCHLD, &act, &oldact);
continue;
}
}
if(pid == 0) {
while(1) {
ret = read(cfd, buf, sizeof(buf));
write(cfd, buf, ret);
write(STDOUT_FILENO, buf, ret);
}
}
return 0;
}
这只是最简单的聊天室雏形 各种功能实现根据自己需要在子进程中添加代码即可
连通之后 使用
nc xxx.xxx.xxx.xxx 端口号 即可完成聊天室
更多推荐
已为社区贡献2条内容
所有评论(0)