2014-09-29 175 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