我知道已经有几个类似的问题,但我没有找到适合我案例的回复。 请考虑一个简单的客户端 - 服务器应用程序,我必须在其中建立TCP连接。
在服务器端,我通过代码等待TCP连接:
$(CC) -c -o $@ $< $(CFLAGS)
在客户端,我通过代码请求TCP连接:
ServerSocket mySS= new ServerSocket(10000);
Socket mySocket_ServerSide= mySS.accept();
Everythink第一次工作时,我在TCP连接(例如文件传输)上完成工作,然后使用以下方法关闭(在客户端)与服务器的连接:
Socket mySocket_ClientSide= new Socket();
mySocket_ClientSide.setReuseAddress(true);
mySocket_ClientSide.bind(new InetSocketAddress(5555)); //always using the same port
mySocket_ClientSide.connect(new InetSocketAddress(serverIP,10000), myTimeout);
几秒钟后,我必须再次连接到服务器,但我得到了一个已经在使用的地址:connect&#34;异常。
我认为客户端进程的状态是TIME_WAIT,正如我在本网站的几个问题中所读到的那样。但由于setReuseAddress(true),我不能再次使用此端口吗?
由于某些原因我必须始终绑定到同一个端口(在示例5555中)。有没有任何解决方案允许我绑定到同一个端口?我在做什么错?
先谢谢你 福斯托
答案 0 :(得分:1)
您的问题体现了相互矛盾的要求:
正如您所猜测的那样,您已经进入了TIME_WAIT状态。这是从同一源IP:端口到同一目标IP:端口的连续连接之间的强制性两分钟差距。 TCP的规则要求这种差距,以确保连接的完整性。
您可以在某些操作系统上缩短TIME_WAIT周期,但不建议这样做。相反,你应该摆脱总是使用相同端口的要求。这没有任何意义,它也可以防止你并行形成多个连接。
答案 1 :(得分:0)
您的服务器只能接受单个连接。您需要在循环中调用(Server)Socket.accept()。 accept()方法将阻塞,直到建立连接。
在您的客户端上,除非您有充分的理由这样做,否则不应将客户端端点绑定到特定端口。删除这些行:
mySocket_ClientSide.setReuseAddress(true);
mySocket_ClientSide.bind(new InetSocketAddress(5555)); //always using the same port