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

Ram*_*Ram 2 c# sockets tcp

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

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

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

Mar*_*ell 8

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

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

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

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

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