套接字接收缓冲区大小

时间:2011-01-05 04:23:20

标签: c# sockets c#-3.0

有没有办法在c#中确定TCPIP套接字的接收缓冲区大小。我正在向服务器发送一条消息,并期待一个我不确定接收缓冲区大小的响应。

            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.125.125.226"),20060);
            Socket server = new Socket(AddressFamily.InterNetwork,
                              SocketType.Stream, ProtocolType.Tcp);
            server.Connect(ipep);

            String OutStr= "49|50|48|48|224|48|129|1|0|0|128|0|0|0|0|0|4|0|0|32|49|50";

            byte[] temp = OutStr.Split('|').Select(s => byte.Parse(s)).ToArray(); 

            int byteCount = server.Send(temp);

            byte[] bytes = new byte[255];
            int res=0;
            res = server.Receive(bytes);
            return Encoding.UTF8.GetString(bytes);

2 个答案:

答案 0 :(得分:6)

用于接收数据的缓冲区大小取决于应用程序或协议。在语言中没有办法告诉你接收缓冲区的大小应该是多少。也没有任何套接字函数可以用来说“你需要一个23867字节来接收这个消息”。通常,您的应用程序必须从协议中确定接收缓冲区的大小以及如何处理它。通常,协议将:

  • 指定消息中的字节数。
  • 指定终止字符(例如hdlc使用0x7e表示消息的结尾)

这样做的结果是您的应用程序可能需要处理拆分消息。例如,服务器可能会发送一个2000字节的消息,但您的接收缓冲区只有1000字节,您必须编写一些代码来维护状态,告诉您是否已完成消息或部分完成。

答案 1 :(得分:4)

TCP是一个字节流。它对你的消息概念一无所知。

因此,您可以在该字节流中提供必要的消息帧信息。执行此操作的常用方法包括在消息前添加一个标题,该标题包含消息的总长度,或者使用无法以有效消息显示的字符终止消息。

我在这里谈到TCP消息框架:http://www.serverframework.com/asynchronousevents/2010/10/message-framing-a-length-prefixed-packet-echo-server.html虽然它引用了C ++代码,但它可能对你没用。

消息使用者处理长度前缀消息的性能通常稍微高一些,并且消息生产者通常可以更加高效地生成字符分隔的消息。就个人而言,我尽可能选择长度带前缀的邮件。

使用长度前缀消息,您将首先发送x字节的数据,这些数据是消息的长度,然后对等体将知道它总是必须至少读取x个字节来计算长度,从那时起它就知道结果消息的大小,可以读取,直到它有那么多字节。

使用字符分隔的邮件,您只需继续阅读并扫描您已阅读的所有数据,直到找到邮件分隔符。然后,你有一个完整的消息,可能还有更多数据(下一条消息的一部分?),然后在缓冲区中进行处理。