проблема с отправкой байтов с клиента на сервер по протоколу TCP - PullRequest
1 голос
/ 28 февраля 2011

Мои 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 ]

5 голосов
/ 28 февраля 2011

Вы заметили, что int offset; не инициализируется?

4 голосов
/ 28 февраля 2011

Может быть, это просто ваш (урезанный?) Пример кода, но вы никогда не инициализируете offset. Может иметь любое значение, например -5000 и заставит цикл отправлять 5669 байт.

4 голосов
/ 28 февраля 2011
  1. Вы должны инициализировать offset с нуля.В противном случае это может быть любое случайное значение.
  2. Вам не нужно Sleep, поскольку send блокировка вызова.
  3. Буфер, который вы отправляете, может быть разделен.Поэтому, если вы отправите, например, буфер 2 КБ, вы можете получить его в двух частях - 1,5 КБ и 0,5 КБ, поэтому вам придется выполнять несколько операций чтения на стороне клиента. MTU обычно устанавливается на 1500 байтов.
...