Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows C套接字,从套接字流中读取N个字节_C_Windows_Sockets - Fatal编程技术网

Windows C套接字,从套接字流中读取N个字节

Windows C套接字,从套接字流中读取N个字节,c,windows,sockets,C,Windows,Sockets,如何在windows 10上从C中的套接字流中准确读取N个字节,我能找到的唯一函数是recv(),它读取所有内容。As,您必须传递到recv()函数4参数: s-套接字描述符 buf-存储读取数据的内存缓冲区 len-内存缓冲区的长度 标志-“影响此函数行为的一个标志或一组标志” 特别是,当最后一个参数设置为定义值MSG_WAITALL时,recv()功能仅在以下事件之一发生时完成: 调用者提供的缓冲区已完全满 连接已关闭 请求已取消或发生错误 换句话说,如果您想精确读取10个字节,则应

如何在windows 10上从C中的套接字流中准确读取N个字节,我能找到的唯一函数是recv(),它读取所有内容。

As,您必须传递到
recv()
函数4参数:

  • s
    -套接字描述符
  • buf
    -存储读取数据的内存缓冲区
  • len
    -内存缓冲区的长度
  • 标志
    -“影响此函数行为的一个标志或一组标志”
特别是,当最后一个参数设置为定义值
MSG_WAITALL
时,
recv()
功能仅在以下事件之一发生时完成:

  • 调用者提供的缓冲区已完全满
  • 连接已关闭
  • 请求已取消或发生错误
换句话说,如果您想精确读取10个字节,则应创建一个10字节的缓冲区,并要求
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确实指定套接字将是流套接字,感谢您的澄清。