如何在C#中获取套接字缓冲区大小

时间:2014-03-21 09:17:33

标签: c# sockets tcp

我有一个通过TCP / IP进行通信的套接字代码。我正在通信的机器在其缓冲区中有缓冲区数据。目前我正在尝试使用此代码获取缓冲区数据。

byte data = new byte[1024];
int recv = sock.Receive(data);   
stringData = Encoding.ASCII.GetString(data, 0, recv);

但是这段代码只检索了11行数据,而机器缓冲区中有更多数据。这是因为我使用了int recv = sock.Receive(data);而数据是1024? 如果是,请如何获取总缓冲区大小并将其检索为字符串。

3 个答案:

答案 0 :(得分:8)

如果您认为自己缺少某些数据,那么您需要检查recv并且几乎可以肯定:循环。幸运的是,ASCII始终是单字节 - 在大多数其他编码中,您还必须担心接收部分字符。

一种常见的方法基本上是:

int recv;
while((recv = sock.Receive(data)) > 0)
{
    // process recv-many bytes
    // ... stringData = Encoding.ASCII.GetString(data, 0, recv);
}

请注意,无法保证stringData将是任何特定的整个工作单元;你发送的东西并不总是你收到的东西,可能是单个字符,14行,或者一个单词的后半部分和另一个单词的前半部分。您通常需要维护自己的接收数据的后台缓冲区,直到您有一个完整的逻辑框架进行处理。

但请注意,Receive总是尝试返回某些内容(至少一个字节),除非入站流已关闭 - 并且会阻止这样做。如果这是一个问题,您可能需要检查可用缓冲区(sock.Available)以决定是执行同步还是异步接收(即在数据可用时同步读取,否则请求异步读取)。

答案 1 :(得分:1)

Socket tcpSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

Console.WriteLine(" ReceiveBufferSize {0}", tcpSocket.ReceiveBufferSize);

对于实际数据,您可以置于以下条件: -

int receiveBytes;
while((receiveBytes = tcpSocket.Receive.Data(receiveBytes)) > 0)
{
}

答案 2 :(得分:1)

尝试以下几点:

StringBuilder sbContent=new StringBuilder();
byte data = new byte[1024];
int numBytes;

while ((numBytes = sock.Receive(data))>0)
{
  sbContent.Append(Encoding.UTF8.GetString(data));
}

// use sbContent.ToString()