0

我的程序实现了 http 客户端(通过从 TCPClient 继承),它将请求发送到 http 服务器以获得块传输编码流(换句话说,通过 HTTP 的视频流)。

为了监控客户端和服务器之间的连接,我启动了后台线程,试图将空字节(0x00)写入同一个套接字并相应地发现连接问题(如此推荐):

while (Client != null && Client.Send(ping) > 0)
    Thread.Sleep(2000);

从两个线程写入的影响是,在 Wire-shark 中,有时我会在同一个数据包中看到 ping 和 HTTP 请求,如下所示:

00 10 18 8d 23 ab 00 11 5d b9 e8 00 08 00 45 00  ....#...].....E.
00 b1 38 21 40 00 3e 06 77 de 0a 3f 03 3d 0a 3f  ..8!@.>.w..?.=.?
74 8d 89 7f 00 50 6b c3 45 a8 9f 76 4a 88 80 18  t....Pk.E..vJ...
13 5d a9 ad 00 00 01 01 08 0a 9c ea b6 a5 00 06  .]..............
9f 8b 47 45 54 20 2f 73 74 72 65 61 6d 2f 31 2f  ..GET /stream/1/
45 76 65 6e 74 41 20 48 54 54 50 2f 31 2e 31 0d  EventA HTTP/1.1.

当然服务器会忽略这个数据包并且看不到http请求。

有什么方法可以写入套接字并使用 Send 方法并确保它将在一个数据包中发送?

[编辑]

正如我从大卫和 TAS 的回答中所理解的那样——这是不可能的。这甚至不是 TCP 的运作方式。

4

2 回答 2

1

不要监视连接。只需尝试使用它,看看您是成功还是失败。相信我,你所做的只会给你带来痛苦。另一端将不知道如何处理您发送的零字节。

于 2013-10-27T14:15:22.473 回答
0

您的方法存在一个问题:像您一样将数据写入 Web 服务器违反了 HTTP,并可能导致服务器崩溃或断开连接。

您正在实现的客户端将不断地从服务器读取数据。读取的调用将显示服务器是否关闭了连接,或者如果发生超时则抛出异常。后者通常会在出现某种网络问题时发生,因为 Web 服务器会优雅地关闭那里的连接。

更新:暂停客户端上的传输不会阻止服务器继续发送块。如果未收到数据,则底层操作系统缓冲区将被填满,最后数据包将被丢弃。最终结果可能是服务器关闭连接,因为它认为网络存在一些问题。

一种解决方案是继续读取块并将它们存储在缓冲区中以供以后播放。如果没有足够的可用内存,那么我会关闭连接并在用户恢复时重新连接。

于 2013-10-27T14:12:41.553 回答