在做这个模型之前 最难的是两台主机之间建立连接互相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 端口号        即可完成聊天室

Logo

更多推荐