Предел связи по сокету TCP - PullRequest
       13

Предел связи по сокету TCP

3 голосов
/ 01 апреля 2010

Существует ли ограничение на размер данных, которые могут быть получены TCP-клиентом. При соединении через сокет TCP сервер отправляет больше данных, но клиент получает только 4K и останавливается.

Ответы [ 5 ]

7 голосов
/ 01 апреля 2010

Я предполагаю, что вы делаете ровно 1 Send и ровно 1 Receive.

Вам нужно выполнить несколько чтений, нет гарантии, что одно чтение из сокета будет содержать все.

Метод Receive считывает столько данных, сколько доступно, вплоть до размера буфера. Но он вернется, когда у него будут какие-то данные, чтобы ваша программа могла его использовать.

2 голосов
/ 01 апреля 2010

Вы можете рассмотреть возможность разделения чтения / записи по нескольким вызовам. У меня определенно были некоторые проблемы с TcpClient в прошлом. Чтобы исправить это, мы используем класс обернутого потока со следующими read/write методами:

public override int Read(byte[] buffer, int offset, int count)
{
    int totalBytesRead = 0;
    int chunkBytesRead = 0;
    do
    {
        chunkBytesRead = _stream.Read(buffer, offset + totalBytesRead, Math.Min(__frameSize, count - totalBytesRead));
        totalBytesRead += chunkBytesRead;
    } while (totalBytesRead < count && chunkBytesRead > 0);
    return totalBytesRead;
}

    public override void Write(byte[] buffer, int offset, int count)
    {
        int bytesSent = 0;
        do
        {
            int chunkSize = Math.Min(__frameSize, count - bytesSent);
            _stream.Write(buffer, offset + bytesSent, chunkSize);
            bytesSent += chunkSize;
        } while (bytesSent < count);
    }

//_stream is the wrapped stream
//__frameSize is a constant, we use 4096 since its easy to allocate.
2 голосов
/ 01 апреля 2010

Без ограничений, TCP-сокет является потоком.

2 голосов
/ 01 апреля 2010

Нет, все должно быть в порядке. Я подозреваю, что ваш код для чтения с клиента имеет недостатки, но трудно сказать, что вы его не показываете.

1 голос
/ 01 апреля 2010

Теоретически нет предела для данных с TCP, НО, поскольку мы ограничены физическими ресурсами (т. Е. Памятью), разработчики, такие как Microsoft Winsock, используют нечто, называемое размером окна tcp.

Это означает, что когда вы отправляете что-то, например, с помощью функции send () Winsock (и не устанавливаете какие-либо параметры для обработчика сокета), данные сначала будут скопированы во временный буфер сокета. Только когда принимающая сторона подтвердит, что он получил эти данные, Winsock снова будет использовать эту память.

Итак, вы можете заполнить этот буфер, отправляя быстрее, чем он освобождается, а затем - ошибка!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...