【问题标题】:Windows socket recv flagsWindows 套接字接收标志
【发布时间】:2018-06-24 03:38:52
【问题描述】:

我正在阅读来自 msdn 的套接字 recv() 文档,我不清楚这些标志的确切作用:

int recv(
  _In_  SOCKET s,
  _Out_ char   *buf,
  _In_  int    len,
  _In_  int    flags //these
);

我查看了winsock2.h,发现了一些标志的值,例如:MSG_OOBMSG_PEEK,但MSG_WAITALL 并没有在那里定义。

您能否向我解释一下每个标志的作用以及它的值是什么(int)?

编辑:我的问题似乎并不清楚,但我确实阅读了有关标志的文档部分,但我仍然不了解每个标志的 recv() 行为,因此如果可能的话,我要求用一个例子来解释每个标志。

【问题讨论】:

  • 标志记录在这里(大约一半):msdn.microsoft.com/en-us/library/windows/desktop/… 如果您搜索“MSDN recv”(或其他函数),您将在第一次点击中获得 MS 文档。
  • 正如我提到的,我阅读了该文件,但描述对我来说没有意义。也许一些例子会做
  • 也许你应该问一个具体的问题,文档对我来说似乎很清楚,你不理解的每个标志具体是什么?
  • 例如当 flags=0 或 4 时 recv 的行为是什么?加上每个标志的值是什么。我认为问题很明确
  • 每个标志的值在winsock2.h 中定义。 (如果缺少任何内容,您需要更新您的 SDK)。 0 是没有标志。 4 是MSG_DONTROUTE(可能)并且没有记录为recv 的有效标志,因此预计会出现错误和未定义的行为。

标签: c++ c windows sockets


【解决方案1】:

recv() 上查看这篇 MSDN 文章:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

老实说,除了MSG_PEEK 之外,我在所做的所有网络工作中都没有使用过这些标志中的任何一个 - 我不明白为什么这些天在大多数情况下都会出现。

您可以查看WinSock2.h 头文件并从中推断出值:

#define MSG_OOB         0x1             /* process out-of-band data */
#define MSG_PEEK        0x2             /* peek at incoming message */
#define MSG_DONTROUTE   0x4             /* send without using routing tables */ 
#define MSG_WAITALL     0x8             /* do not complete until packet is */ 

【讨论】:

  • 感谢这个答案,但我对每个标志都缺乏解释。例如,如果MSG_PEEK=0x2“查看传入的消息”,这是否意味着缓冲区在传输过程中被填满?为什么代码示例使用标志 0x0?甚至没有列出..甚至从 MSDN 文档中也不清楚
  • Peek 只允许您读取数据而无需将其从队列中取出。如果您想延迟发生这种情况,这很有用。
  • @AK_:文档非常清楚每个标志的作用。例如,0 表示“没有标志”,MSG_PEEK 表示:“查看传入数据。数据被复制到缓冲区中,但不会从输入队列中删除。” 什么部分你还不清楚吗?从网络接收数据并放入套接字的输入队列中,以供您的代码读取。然后,当您从输入队列中读取数据时,MSG_PEEK 会将数据复制到缓冲区中并将数据留在队列中,以便下一次 recv() 调用可以再次看到它(您正在“偷看”数据)。
  • 当我设置 flags=0x8 时出现错误,为什么?应该是阻塞调用,一直等到传输结束吧?
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2012-03-08
  • 2023-03-30
相关资源
最近更新 更多