我正在使用TCP套接字建立服务器 - 客户端连接.每当我关闭客户端套接字时,我的服务器也会关闭.但我希望只关闭我的客户端,我的服务器必须等待下一次accept().
服务器端:
{
bind(lfd,(struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(lfd, 10);
while(1)
{
cfd = accept(lfd, (struct sockaddr*)NULL, NULL);
//server must wait here after client closes the connection application code
close(lfd);
}
}
Run Code Online (Sandbox Code Playgroud)
客户端:
inet_pton(AF_INET, argv[1], &serv_addr.sin_addr);
connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
// ... application code
if(c == 1)
close(fd);
Run Code Online (Sandbox Code Playgroud)
描述符描述的 TCP 监听套接字lfd用于等待特定端口上的 TCP 传入连接。accept创建新套接字描述符的调用后,cfd在您的示例中。
服务器和客户端之间的所有数据交换都是使用cfd. 如果客户端首先关闭套接字,则可能send或recv在服务器端,将返回 -1 和适当的errno值。
如果您希望服务器关闭连接,您应该在后面使用shutdown(cfd, SHUT_RDWR)and close(cfd),而不是close(lfd)。这让lfd套接字打开,允许服务器等待下accept一个传入连接。应lfd在服务器终止时关闭。
这shutdown()提供了更大的灵活性,可以在通信永久终止之前发送或接收剩余数据。
在accept服务器端,只为该客户端生成一个新套接字.
当您完成与客户端的交易后,您必须使用 close()该套接字(这close(cfd)在您的术语中).您也可以shutdown()使用套接字 - 这将影响套接字在TCP级别的关闭方式.但无论你做或不做shutdown(),你必须 close()这样做,否则你会泄漏FD.
在你打算不再接受任何连接之前,你不能close()听你的fd(lfd在你的程序中).
TLDR:close(lfd)改为close(cfd)