使用TCP从客户端向服务器发送字节的问题

时间:2011-02-27 22:47:33

标签: c++ c sockets winsock

我的send()和recv()如下所示:

int Send(const char* buffer, int size)
{
    cout << "SIZE: " << size << endl;
    int offset;
    while(offset < size)
    {
        int n = ::send(getSocket(), buffer + offset, size - offset, 0);
        if(n == SOCKET_ERROR)
        {
            break;
        }
        offset += n;
        if(offset != size)
        {
            Sleep(1);
        }
    }
    return offset;
}

int Recv(char* buffer, int size)
{
    int n = ::recv(getSocket(), buffer, size, 0);
    if(n == SOCKET_ERROR)
    {
        cout << "Error receiving data" << endl;
    }
    if(n == 0)
    {
        cout << "Remote host closed connection" << endl;
    }
    return n;
}

但是我的输出显示了许多发送的字节,这对我来说很奇怪:

Received from client: 669
Sent to web server: 3990336

所以它应该发送669个字节,所以从哪里得到3990336?这是某种错误还是?

感谢。

3 个答案:

答案 0 :(得分:5)

您是否注意到int offset;未初始化?

答案 1 :(得分:4)

  1. 您必须将offset初始化为零。否则它可能是任何随机值。
  2. 由于Sleep来电正在阻止,您不需要send
  3. 您要发送的缓冲区可能会被拆分。因此,如果您发送2K缓冲区,则可以分为两部分 - 1.5K和0.5K,因此您必须在客户端执行多次读取。 MTU通常设置为1500字节。

答案 2 :(得分:4)

也许这只是你的(剥离?)示例代码,但你从未真正初始化offset。它可能有任何价值,例如-5000并将导致循环发送5669个字节。