传智扫地僧课程学习笔记。
在之前通信的基础之上,
运行多个客户端,
能建立成功,通过netstat -an | grep 8001,也可以看到连接建立起来了,
可是无法通信,
总的来说就是,连接建立成功,可是无法通信,
原因就是,连接建立是TCP/IP内部为我们处理的,而通信部分是我们自己写的,却没有进行相关的处理,
我们可以通过fork创建进程,每来一个连接,创建一个进程,
unsigned int conn = 0;
//accept 返回一个新的连接 ,这个新的连接是一个主动套接字
while (1)
{
conn = accept(sockfd, (struct sockaddr *) &peeraddr,
(socklen_t *) &peerlen);
if (conn == -1)
{
perror("fun listen\n");
exit(0);
}
printf("perradd:%s\n perrport:%d\n", inet_ntoa(peeraddr.sin_addr),
ntohs(peeraddr.sin_port));
int pid = fork();
if (pid == 0)
{
close(sockfd); //子进程不需要侦听,
char revbuf[1024] = { 0 };
while (1)
{
int ret = read(conn, revbuf, sizeof(revbuf));
if (ret == 0)
{
//如果在读的过程中,对方已经关闭,tcpip协议会返回一个0数据包
printf("对方已关闭\n");
exit(0);
} else if (ret < 0)
{
perror("读数据失败\n");
exit(0);
}
//ssize_t write(int fd, const void *buf, size_t count);
fputs(revbuf, stdout); //服务器端收到数据,打印屏幕
write(conn, revbuf, ret); //服务器端回发信息
}
} else if (pid > 0)
{
close(conn); //父进程不需要conn
} else
{
close(conn);
//close(sockfd);
}
}
这个conn定义的位置,还得放外面,有点不知道为什么。
开始觉得,都是一个函数,又没有进入子进程,能有什么问题,
后来一想,这个while(1),是一直循环,那岂不是一直在定义,
你可以不同时刻给它赋予不同的值,但是你要是一直定义,就肯定有问题了。