关闭客户端套接字并保持服务器套接字活

Sat*_*iya 1 c sockets

我正在使用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)

Man*_*nos 6

描述符描述的 TCP 监听套接字lfd用于等待特定端口上的 TCP 传入连接。accept创建新套接字描述符的调用后,cfd在您的示例中。

服务器和客户端之间的所有数据交换都是使用cfd. 如果客户端首先关闭套接字,则可能sendrecv在服务器端,将返回 -1 和适当的errno值。

如果您希望服务器关闭连接,您应该在后面使用shutdown(cfd, SHUT_RDWR)and close(cfd),而不是close(lfd)。这让lfd套接字打开,允许服务器等待下accept一个传入连接。应lfd在服务器终止时关闭。

shutdown()提供了更大的灵活性,可以在通信永久终止之前发送或接收剩余数据。


abl*_*igh 6

accept服务器端,只为该客户端生成一个新套接字.

当您完成与客户端的交易后,您必须使用 close()该套接字(这close(cfd)在您的术语中).您可以shutdown()使用套接字 - 这将影响套接字在TCP级别的关闭方式.但无论你做或不做shutdown(),你必须 close()这样做,否则你会泄漏FD.

在你打算不再接受任何连接之前,你不能close()听你的fd(lfd在你的程序中).

TLDR:close(lfd)改为close(cfd)