我正在使用將處理多個客戶端的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;
}
}
如果你不需要保留'msg'的值(在發佈的代碼中就是這樣),你可以在每次發送之後說'msg + = bytesResult;'。 –