2013-03-13 51 views
0

我對網絡非常陌生,並且在while循環中發送消息時遇到問題。Winsock無法在while循環中發送

據我所知,我應該做點什麼沿着此線:

Create Socket() 
Connect() 

While 
    Do logic 
    Send() 
End while 

Close Socket() 

但是每發送一次,並返回-1出現後。

該代碼將僅在循環中創建套接字時起作用。

While 
    Create Socket() 
    Connect() 
    Do logic 
    Send() 
    Close Socket() 
End while 

這裏是我使用的,但不工作的一段代碼:)

//init winsock 
WSAStartup(MAKEWORD(2, 0), &wsaData); 

//open socket 
    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

    //connect 
    memset(&serveraddr, 0, sizeof(serveraddr)); 
    serveraddr.sin_family  = AF_INET; 
    serveraddr.sin_addr.s_addr = inet_addr(ipaddress); 
    serveraddr.sin_port  = htons((unsigned short) port); 
    connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)); 

while(true) { 

    if (send(sock, request.c_str(), request.length(), 0)< 0 /*!= request.length()*/) { 
     OutputDebugString(TEXT("Failed to send.")); 
    } else { 
     OutputDebugString(TEXT("Activity sent.")); 
    } 
    Sleep(30000); 
} 
//disconnect 
closesocket(sock); 

//cleanup 
WSACleanup(); 

功能CheckForLastError(返回:10053

WSAECONNABORTED 軟件導致連接中斷。 一個已建立的連接被軟件在您的主機終止,可能是由於數據傳輸超時或協議錯誤

感謝

+0

連接也應該在while循環之外。你能舉出一個你遇到問題的例子嗎? – Default 2013-03-13 11:07:44

+0

我寫了關於winsock [這裏](http://stackoverflow.com/a/2920787/238902「C++ Winsock P2P」)的廣泛答案。這可能有一些幫助? – Default 2013-03-13 11:09:15

+0

正確的方法是你的第一個例子,它只發送一次,然後返回一個錯誤。你應該調用[WSAGetLastError](http://msdn.microsoft.com/en-us/library/windows/desktop/ms741580%28v=vs.85%29.aspx)來得到那個錯誤,這應該給你一個提示至於爲什麼它失敗。你的第二個例子僅僅是因爲你是第一個例子_repeating;創建套接字,連接,發送,關閉套接字,回到第一步。 – 2013-03-13 11:27:00

回答

0

要了解你的程序如何以及爲什麼失敗,你必須瞭解的功能你用。 其中有些是阻塞功能,有些則不是。其中一些需要以前的其他功能,其中一些功能不需要。 現在從我的理解我們在這裏談論客戶,而不是服務器。 在這種情況下,客戶端只有非阻塞功能。這意味着每當你調用一個函數時,它都會在不等待的情況下執行。 所以send()會在第二個被調用的時候發送數據,並且這個流將繼續到下一行代碼。 如果要發送的信息尚未準備好,您將遇到問題,因爲不會發送任何內容。 要解決它,你可以使用某種延遲。延遲的問題在於它們是阻塞函數,意味着一旦遇到延遲,流將停止。爲了解決它,你可以創建一個線程並鎖定它,直到信息準備好發送。 但是,這將做一個發送()的工作。你會發送信息和那個。 如果你想保持通信並重復發送信息,你需要創建一個while循環。一旦你有一段時間循環,你不必擔心任何事情。這是因爲您可以通過流控制來驗證信息是否準備就緒,並且可以在終止連接之前重複使用發送。 現在的問題是在服務器端發生了什麼? 「ipaddress」應該保存服務器的IP地址。服務器可能會拒絕您的連接請求。或者最差的他可能會接受您的請求,但他正在使用與您的客戶端有關的不同設置進行監聽。意味着服務器可能不會收件(沒有recv()功能)信息,而您試圖發送信息...可能會在錯誤/崩潰和不是什麼的情況下發生。