Berkeley Socket在成功的非阻塞发送时发送返回0

时间:2013-01-01 19:54:01

标签: c++ networking berkeley-sockets

我正在编写一个非阻塞的聊天服务器,到目前为止服务器工作正常,但我无法弄清楚如果发生部分发送如何纠正。 send(int,char *,int);函数总是在成功时返回0,在失败的发送时返回-1。我读过的每个doc / man页面都说它应该返回实际提供给网络缓冲区的字节数。我已经检查过以确保我可以发送到服务器并重复恢复数据而没有问题。

这是我用来调用send的函数。我都试图先将返回数据打印到控制台,然后在返回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;        
}

1 个答案:

答案 0 :(得分: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;        
}

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