Windows C套接字,从套接字流中读取N个字节
如何在windows 10上从C中的套接字流中准确读取N个字节,我能找到的唯一函数是recv(),它读取所有内容。As,您必须传递到Windows C套接字,从套接字流中读取N个字节,c,windows,sockets,C,Windows,Sockets,如何在windows 10上从C中的套接字流中准确读取N个字节,我能找到的唯一函数是recv(),它读取所有内容。As,您必须传递到recv()函数4参数: s-套接字描述符 buf-存储读取数据的内存缓冲区 len-内存缓冲区的长度 标志-“影响此函数行为的一个标志或一组标志” 特别是,当最后一个参数设置为定义值MSG_WAITALL时,recv()功能仅在以下事件之一发生时完成: 调用者提供的缓冲区已完全满 连接已关闭 请求已取消或发生错误 换句话说,如果您想精确读取10个字节,则应
recv()
函数4参数:
-套接字描述符s
-存储读取数据的内存缓冲区buf
-内存缓冲区的长度len
-“影响此函数行为的一个标志或一组标志”标志
MSG_WAITALL
时,recv()
功能仅在以下事件之一发生时完成:
- 调用者提供的缓冲区已完全满
- 连接已关闭
- 请求已取消或发生错误
recv()
函数仅在缓冲区已满时返回
char data[10];
recv(streamSocket, data, 10, MSG_WAITALL);
希望有帮助请注意,根据使用的协议,
recv()
可能会丢弃任何不适合缓冲区的数据。当使用TCP时,您可以读取这样的小数据块,并且不会丢失任何数据。但是,当使用UDP时,您当然仍然可以读取一小块数据,但数据包的其余部分将被丢弃。它是有效的,谢谢,我知道MSG_WAITALL,但我不知道这意味着注意,并非所有平台都支持MSG_WAITALL
,在这种情况下,替代方法是只调用recv()
循环,直到收到所需的字节数,例如:字符数据[10];char*ptr=数据;尺寸长度=10;do{int num=recv(streamSocket,ptr,len,0);if(num 0);
@FelixG你完全正确。我建议使用该方法,因为OP确实指定套接字将是流套接字,感谢您的澄清。