2014-09-29 180 views
0

我希望客户机程序(TCP)准备好在服务器开始接受()传入连接时连接到服务器程序(客户机程序应始终保持运行,服务器程序可以随时开始或结束)。客户端代码如下所示:无法断开连接并重新连接套接字(C++,winsock2)

while (1) { 

    //Wait for the server to accept the connection: 
    while (connect(socket,(sockaddr*)&addr,sizeof(addr))!=0) {cout<<WSAGetLastError()<<endl;} 

    //Send whatever data... 

} 

第一次执行while(1)循环时,所有内容都按预期方式运行;当客户端连接到服务器时,它将发送所有数据,并且服务器程序结束。然后我希望客户端在while(connect(...,...,!)!= 0)循环中再次等待,直到服务器再次启动并接受()连接,但它不连接到服务器和WSAGetLastError()返回10056,表示套接字已连接(为什么?)。我听说在套接字上调用closesocket()之后你不能重新连接客户端,所以我试图在重新连接之前断开连接,通过向while(1)循环中添加shutdown(socket,SD_SEND),但这也不起作用。

除了重复等待客户端程序结束并重新启动它之外,还有什么可以做的吗?有什么方法可以断开客户端与服务器程序的连接,以便客户端可以稍后重新连接?

+0

什么?关闭插座! '我听说你在socket上调用closesocket()后不能重新连接客户端 - 你听到了什么? – 2014-09-29 10:31:12

+0

当服务器程序结束时,它是否关闭连接的结束?它应该做的。 – 2014-09-29 10:34:28

+0

@MartinJames它不关闭连接._。无论等待多久,它总是会返回10056 ... – 2014-09-29 11:52:29

回答

1

您的应用程序逻辑存在严重问题。你不需要需要重新连接一个连接的插座;你不能重新连接一个连接的插座;并且您无法重新连接已关闭的套接字,除非您正在探索Windows API的某个远程角落。

+0

为什么关闭后不能重新连接?我确信我之前已经做到了! – 2014-09-29 10:49:40

+0

@MartinJames你是怎么做到的? – 2014-09-29 11:41:58

+0

@EJP如果关闭服务器程序并重新启动它,如果我不应该再次调用connect(),那么如何定义我将在服务器上使用的套接字? – 2014-09-29 11:48:58