TcpClient.Receive - усеченные данные - PullRequest
0 голосов
/ 09 июля 2010
private static Socket ConnectSocket(string server, int port)
{
    Socket s = null;
    IPHostEntry hostEntry = null;

    hostEntry = Dns.GetHostEntry(server);

    foreach (IPAddress address in hostEntry.AddressList)
    {
        IPEndPoint ipe = new IPEndPoint(address, port);
        Socket tempSocket =
            new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        tempSocket.Connect(ipe);

        if (tempSocket.Connected)
        {
            s = tempSocket;
            break;
        }
        else
        {
            continue;
        }
    }
    return s;
}

//...

Socket s = ConnectSocket(server, port);

//...

do
{
    bytes = s.Receive(bytesReceived, bytesReceived.Length, 0); // 1
    page = page + Encoding.UTF8.GetString(bytesReceived, 0, bytes); // 2
}
while (bytes == 1024);

Это обрезанные (без конца) данные "страницы".Если между "/ / 1" и "/ / 2" напишите System.Threading.Thread.Sleep(100), то все работает.

1 Ответ

0 голосов
/ 09 июля 2010

Я не понимаю, как это могло бы работать. Нет перегрузки приема только с тремя параметрами. Кроме того, вы поместили bytesReceived.Length в неправильное положение.

s.Receive(bytesReceived, 0, bytesReceived.Length);

Редактировать: Ооо. Вы используете ноль для SocketFlags. Не используйте магические числа.

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

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

...