TcpClient.Receive - 截断的数据

时间:2010-07-09 09:11:09

标签: .net tcpclient

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 :(得分:0)

我看不出那是怎么回事。只有三个参数没有接收过载。此外,您已将bytesReceived.Length置于错误的位置。

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

编辑:哦。你正在为SocketFlags使用零。不要使用幻数。

然后没有什么说每次必须到达1024个字节,TCP不是那样构建的。 TCP仅保证所有字节都将到达,而不是何时或如何。

您必须知道在发送所有内容时您将接收多少字节或在另一端断开连接。