服务器套接字编程 TCP 连接地址已被使用

Server Socket Programming TCP Connection Address already in use

现在这对我有用。但是然后我必须确保客户端重新连接在某个时间说两分钟后开始。再次启动客户端需要一些时间,并且会抛出已在使用的地址。但一分钟后,它被允许绑定和收听,而这并没有发生。这是我需要等待的 TTL 时间吗?

我编写了一个服务器套接字程序,其中服务器和客户端 运行ning 在同一主机上。服务器仅写入(服务器没有读取操作),而客户端仅从服务器读取(客户端没有写入)。当我终止服务器进程并再次尝试 运行 时,它显示地址已在使用中。使用 SO_REUSEADDR 时,它允许我重用端口,但客户端不再从服务器接收数据。部分服务器代码

while(1)
{
  write(newsockfd,"I got your message",18); //Server Publishes data all day
}

部分客户端代码:-

while(1)
{ 
   n = read(sockfd,buffer,255);//Read all server publishes and store them
   if (n == 0) 
        error("ERROR reading from socket");
   printf("Here is the message: %s \n",buffer);
   bzero(buffer,256); //Buffer set to Null again
}

如果在连接上我尝试 netstat -a 我可以看到我的服务器正在侦听我绑定它的 20001 端口。但是即使客户端和服务器都是 运行ning ,我仍然看不到建立连接。客户端保持打印从 服务器。当我终止服务器进程时,我看到客户端在每次读取后将换行符打印为缓冲区设置为 NULL。现在我的问题是,是否已经建立了现在终止的连接,这是否会阻止服务器侦听同一端口?我的主要问题 如果是这样,为什么没有其他进程在监听该端口? SO_REUSEADDR 允许服务器绑定和重用地址。这是因为服务器和客户端 运行ning 在同一主机上吗?如果终止是不恰当的(次要问题),如何处理。在评论中添加读取检查后,我仍然看到客户端 运行ning 并且 netstat 给我以下输出:-

  xyz@xyz:~$ netstat -a | grep -i 2001
  tcp        0      0 localhost:47058         localhost:2001  CLOSE_WAIT 
  tcp        0      0 localhost:2001          localhost:47058 FIN_WAIT2  

提前致谢

看来您对 TCP 的工作原理有点困惑。

当您终止并重新启动服务器时,客户端不再连接,因此它需要关闭它的 TCP 连接端,即再次调用 close(2) on the socket descriptor, then create a new socket(2) and connect(2) 它。

您可能缺少从客户端套接字上的 read(2) 返回的 0(零),这意味着另一端已关闭其连接端。

. When i kill server process and try to run again it says Address already in Use. When using SO_REUSEADDR it allows me to reuse the port but client no more receives data from server.

您不能让您的客户端继续运行,就好像服务器没有发生任何事情一样。客户端应检测断开的连接并从其端关闭套接字并重新启动连接建立过程。旧连接永远消失了。