【问题标题】:How to get the Socket Buffer size in C#如何在 C# 中获取 Socket 缓冲区大小
【发布时间】:2014-04-28 13:46:57
【问题描述】:

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

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

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

【问题讨论】:

  • “而机器缓冲区中有更多数据”:你怎么知道的?
  • 您刚刚要求从套接字读取 1024 个字节。您可能需要循环直到它不返回任何数据(0 字节)。
  • 如果这 11 行总共是 1024 字节,那就有意义了。
  • @bansi 如何一次接收所有数据?
  • @bansi 确实,您不太可能在一次读取中获得所有数据;因此,接收缓冲区通常不需要很大。

标签: c# sockets tcp


【解决方案1】:

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

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

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

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

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

【讨论】:

  • @bansi 假设我做了“相当多”的套接字工作;p
  • 我还是给了你+1 ;-)
【解决方案2】:

尝试以下方法:

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()

【讨论】:

    【解决方案3】:
    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)
    {
    }
    

    【讨论】:

    • ReceiveBufferSize 不是缓冲区中数据的大小。它是windows为socket分配的缓冲区大小
    • 如 msdn 网站中所述:“获取或设置一个指定 Socket 接收缓冲区大小的值。”
    • @bansi 请注意 Q 的问题:这直接回答了问题。 (当然,提问者并不确定他们在问什么,因为他们似乎对套接字(以及一般的网络)发送数据的方式做出了重要的假设。)
    • @Neel 完全正确。而不是实际数据的大小。可以或多或少。
    • 我已经回答了我从问题中理解的内容。是的,同意你@Richard
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多