Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C++ 使用recv()接收部分数据,可能吗?_C++_Sockets_Winsock_Recv - Fatal编程技术网

C++ 使用recv()接收部分数据,可能吗?

C++ 使用recv()接收部分数据,可能吗?,c++,sockets,winsock,recv,C++,Sockets,Winsock,Recv,我在winsock中使用非阻塞套接字,我想知道是否可以部分接收数据 我的数据包包含一个“长度”字,我必须先读它,然后根据“长度”读整个数据包 实际上,这个问题类似于“recv()如何工作和结束?”,我可以使用recv()直到获得所有数据吗?这取决于套接字的类型。如果它是一个数据报套接字,recv将准确读取整个数据报。如果是TCP套接字: recv将在返回前读取至少一个字节 recv可以读取多条完整的信息 如果您正在使用TCP,您可能需要执行以下操作: 至少读取包含长度的字节 读取长度字节

我在winsock中使用非阻塞套接字,我想知道是否可以部分接收数据

我的数据包包含一个“长度”字,我必须先读它,然后根据“长度”读整个数据包


实际上,这个问题类似于“recv()如何工作和结束?”,我可以使用recv()直到获得所有数据吗?

这取决于套接字的类型。如果它是一个数据报套接字,
recv
将准确读取整个数据报。如果是TCP套接字:

  • recv
    将在返回前读取至少一个字节
  • recv
    可以读取多条完整的
    信息
如果您正在使用TCP,您可能需要执行以下操作:

  • 至少读取包含长度的字节
  • 读取
    长度
    字节
  • 你现在有一个完整的消息
  • 冲洗,重复

您可以从开始。它取决于套接字的类型。如果它是一个数据报套接字,
recv
将准确读取整个数据报。如果是TCP套接字:

  • recv
    将在返回前读取至少一个字节
  • recv
    可以读取多条完整的
    信息
如果您正在使用TCP,您可能需要执行以下操作:

  • 至少读取包含长度的字节
  • 读取
    长度
    字节
  • 你现在有一个完整的消息
  • 冲洗,重复

对于TCP套接字,您可以从。

开始:您可以在循环中使用recv,直到获得足够的字节。
请注意,recv返回的字节数可能少于您请求的字节数。在这种情况下,只需继续调用,直到您获得完整的消息。

对于TCP套接字:您可以在循环中使用recv,直到获得足够的字节。
请注意,recv返回的字节数可能少于您请求的字节数。在这种情况下,只需一直打电话,直到收到全部信息。

这是相对操作吗?我的意思是我有一个带有字符x,y,z的包;首先我读1个字节,所以我得到了x,如果我读1个字节或者y,我会再次得到x吗?这是一个相对运算吗?我的意思是我有一个带有字符x,y,z的包;首先我读1个字节,所以我得到了x,如果我读1个字节还是y,我会再次得到x吗?