2017-03-02 37 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返回时,它到底意味着什么? –