Socket.Receive - 结局在哪里?

时间:2009-12-23 01:55:45

标签: c# .net http sockets

我想从客户端接收数据。确切地说,客户端发送的所有数据。但后来我想发回一些数据,所以我不想关闭连接。

也许已经到了深夜(至少在德国) - 我怎么能这样做?通常我会说我最后会放一个分号或类似的东西,但像HTTP这样的协议也不会这样做(或者它们呢?)。它是如何在那里工作的?

谢谢你,eWolf

3 个答案:

答案 0 :(得分:4)

使用HTTP协议,Content-Length标头用于预先确定有多少数据。

你可以在你的协议中做类似的事情。

答案 1 :(得分:3)

如果另一端正常关闭套接字,则一旦收到所有数据,接收呼叫将返回零,以指示已到达流末尾。但是,此流结束条件是永久性的,并阻止另一端在套接字上发送更多数据。

TCP / IP是一种流协议,不了解逻辑/特定于应用程序的消息有多大。除非您使用上面提到的流末尾指示,否则您需要在发送的数据中构建自己的指标。这有时被称为“框架”。例如,发送方可以在数据前面加上后面的字节数。接收方将首先读取此前缀并进行完整性检查,确认它是合理的数字。然后接收器在循环中调用Receive,直到接收到许多字节为止。

有关框架的详细信息,请访问:http://nitoprograms.blogspot.com/2009/04/message-framing.html

答案 2 :(得分:1)

查找null终止符(0),它可以是不同的大小,具体取决于数据的编码。

ASCII将有一个1字节的空终止符。