【问题标题】:Socket Receive data not completedSocket 接收数据未完成
【发布时间】:2012-12-05 19:06:22
【问题描述】:

我写了一个简单的套接字发送特定的请求到互联网服务器并接收响应 但是当请求发送和套接字进入接收模式返回值结果时我有问题 不完整,例如仅接收 25000 字节的 1075 字节。

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
skt.Connect(hdr.Host, 80);

byte[] req_as_bytes = Encoding.UTF8.GetBytes(RequestParam);
SentLength = skt.Send(req_as_bytes);
skt.Send(Data, SocketFlags.None);

ReturnLength = skt.Receive(Data);

skt.Shutdown(SocketShutdown.Both);
skt.Close();

但是当我在 skt.recive() 之前休眠时,数据会像这段代码一样从服务器接收

Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream,             ProtocolType.Tcp);
skt.Connect(hdr.Host, 80);
byte[] req_as_bytes = Encoding.UTF8.GetBytes(RequestParam);
SentLength = skt.Send(req_as_bytes);
skt.Send(Data, SocketFlags.None);

System.Threading.Thread.Sleep(4000);

ReturnLength = skt.Receive(Data);

skt.Shutdown(SocketShutdown.Both);
skt.Close();

解决这个问题的最佳方案是什么

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    socket.Receive 返回读取的数据数量。见http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

    您应该检查ReturnLength 并循环直到收到您预期的数据。

    TCP 是一种面向流的协议。您将按照发送的顺序接收数据,但不保证发送和接收的数据块是相等的。

    【讨论】:

    • 当我在第一次接收后循环接收时抛出异常“现有连接被远程主机强行关闭”
    • do { a = skt.Receive(Data, ReturnLength, 500 * i - ReturnLength, SocketFlags.None); skt.Receive(数据);返回长度 += a;我++; } while (a != 0);
    • @Moharrer 可能发件人在阅读器获取所有数据之前关闭了连接。你应该设备一些协议来同步它们。例如发送数据长度、发送数据、等待OK等
    • 非常感谢,但例如我收到了来自 Firefox 到 www.yahoo.com 的请求。我无法与雅虎同步 :)
    • @Moharrer 如果您真的想使用纯 tcp 套接字与 Web 服务器通信,那么您应该阅读http protocol(基于 TCP)。如果你想完全实现它,我可以向你保证这将是一个痛苦的 *ss。我建议为此使用 WebClientHttpWebRequest 类。
    猜你喜欢
    • 2015-07-31
    • 2016-07-24
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2018-12-10
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多