我有一个通过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
?如果是,如何获取总缓冲区大小并将其检索为字符串.
如果您认为缺少某些数据,那么您需要检查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
)以决定是执行同步还是异步接收(即在数据可用时同步读取,否则请求异步读取).