这对我有用。但是,我必须确保客户端重新连接在两分钟之后开始。作为启动客户端再次需要一段时间,并且已经在使用的地址被抛出。但过了一会儿就可以绑定并听取未发生的事情。这个TTL时间我需要等待吗?
我编写了一个服务器套接字程序,其中我的服务器和客户端在同一主机上运行。服务器只写入(服务器没有读取操作),而客户端只从服务器读取(没有客户端写入)。当我杀死服务器进程并尝试再次运行时,它说地址已在使用中。使用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我绑定它。但即使两个客户端服务器都在运行,我仍然无法看到建立连接。客户端保持打印接收的数据 服务器。当我杀死服务器进程时,我看到客户端只是在每次读取后将换行符打印为缓冲区设置为NULL。现在我的问题是,是否已建立连接,现在已终止,这是否会阻止Server侦听同一端口?我的主要问题如果是这样,为什么没有其他进程监听该端口? SO_REUSEADDR允许服务器绑定并重新使用ADDR。这是因为服务器和客户端在同一台主机上运行吗?如果终止是不正确的,如何处理(次要问题)。在注释中添加读取检查后,我仍然看到客户端正在运行,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
提前致谢
答案 0 :(得分:1)
看起来你对TCP如何工作有点困惑。
当您终止并重新启动服务器时,客户端不再连接,因此需要关闭其TCP连接的末尾,即在套接字描述符上调用close(2)
,然后创建一个新的{{再次3}}和socket(2)
。
您可能缺少从客户端套接字上的connect(2)
返回的0(零),这意味着另一端已关闭其连接结束。
答案 1 :(得分:0)
。当我杀死服务器进程并尝试再次运行时,它说地址已经在使用中。使用SO_REUSEADDR时,它允许我重用端口,但客户端不再接收来自服务器的数据。
您无法让客户端继续运行,就好像服务器没有任何反应一样。客户端应检测断开的连接并从其端部关闭套接字并重新开始连接建立过程。旧连接已经消失了。