0

我正在编写一个非阻塞聊天服务器,到目前为止服务器工作正常,但我不知道如何纠正部分发送,如果它们发生。发送(int, char*, int); 函数总是在发送成功时返回 0,在发送失败时返回 -1。我读过的每个文档/手册页都说它应该返回实际馈送到网络缓冲区的字节数。我已经检查以确保我可以发送到服务器并重复接收数据而不会出现问题。

这是我用来调用发送的函数。我都尝试先将返回数据打印到控制台,然后尝试在 return ReturnValue 上换行;调试时。结果相同,ReturnValue 始终为 0 或 -1;

int Connection::Transmit(string MessageToSend)
{         
    // check for send attempts on a closed socket
    // return if it happens.
    if(this->Socket_Filedescriptor == -1)
        return -1;

    // Send a message to the client on the other end
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions.
    ReturnValue  = send(Socket_Filedescriptor,
                         MessageToSend.c_str(),
                         MessageToSend.length(),
                         0); 

    return ReturnValue;        
}
4

1 回答 1

0

为什么不尝试循环发送?例如:

int Connection::Transmit(string MessageToSend)
{         
    // check for send attempts on a closed socket
    // return if it happens.
    if(this->Socket_Filedescriptor == -1)
        return -1;

    int expected = MessageToSend.length();
    int sent     = 0;

    // Send a message to the client on the other end
    // note, the last parameter is a flag bit which 
    // is used for declaring out of bound data transmissions.
    while(sent < expected) {
      ReturnValue  = send(Socket_Filedescriptor,
                         MessageToSend.c_str() + sent, // Send from correct location
                         MessageToSend.length() - sent, // Update how much remains
                         0); 
      if(ReturnValue == -1)
        return -1; // Error occurred
      sent += ReturnValue;
    }

    return sent;        
}

这样,您的代码将不断尝试发送所有数据,直到发生错误或成功发送所有数据。

于 2013-01-02T00:17:30.270 回答