2017-03-02 35 views
-1

我正在使用將處理多個客戶端的WSA編寫服務器c。協議是我自己定義的東西,我遇到的問題是如何確保整個消息實際上被髮送到客戶端。C winsock函數發送所有消息數據

send我的消息一次,而且我檢查實際傳輸的字節數。那麼,如果沒有,我再次send,並且隨着我現在發送的數據的長度,我使用unsentBytes(參見代碼)。 我的問題是,當我嘗試發送未發送的額外字節時,我正在重新發送整個消息。我如何只發送留言的剩餘部分?

我知道我一次只能發送1個字符,並且在消息結束時停止接收客戶端,但我認爲我也可以像這樣做,並且它更好。

這是正確的使用邏輯嗎?

int send_msg(SOCKET s, char *msg, int msg_len) 
{ 
    int unsentBytes = msg_len; 
    int bytesResult = send(s, msg, msg_len, SEND_FLAGS); 
    unsentBytes -= bytesResult; 
    while (unsentBytes != 0) 
    { 
     bytesResult = send(s, msg, unsentBytes, SEND_FLAGS); // ### msg is the problem 
     unsentBytes -= bytesResult; 
    } 
} 
+0

如果你不需要保留'msg'的值(在發佈的代碼中就是這樣),你可以在每次發送之後說'msg + = bytesResult;'。 –

回答

1

這是我自己的項目之一的工作代碼。注意data + count以抵消數據。

int sendall(int sd, char *data, int length) { 
    int count = 0; 
    while (count < length) { 
     int n = send(sd, data + count, length, 0); 
     if (n == -1) { 
      return -1; 
     } 
     count += n; 
     length -= n; 
    } 
    return 0; 
} 
+0

感謝您的回答。當使用這個代碼,並在類似的接收 - 我不應該處理我收到/發送0字節的選項? –

+0

如果'send'返回零,它將會再次嘗試。 – FogleBird

+0

明白了。所以當-1返回時,它到底意味着什麼? –