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
Sockets 忽略进入TCP套接字的数据_Sockets_Posix - Fatal编程技术网

Sockets 忽略进入TCP套接字的数据

Sockets 忽略进入TCP套接字的数据,sockets,posix,Sockets,Posix,一些协议(如HTTP)可以指定消息长度,然后发送(可能很长)消息。发送此消息时无法接收其他消息(HTTP/2.0试图解决此问题),因此如果您决定忽略此消息,则不能继续等待消息而不提取其数据 通常情况下,我会在垃圾缓冲区中重复读取()直到消息的长度,而忽略字节。但这涉及到将可能数百万字节从内核空间复制到用户空间(每个内存页1个拷贝,所以不是数百万个拷贝)。难道没有办法告诉内核放弃字节而不是提供它们吗 这似乎是一个显而易见的问题,但我能找到的唯一答案是奇怪的资源密集型问题,要么使用splice()将

一些协议(如HTTP)可以指定消息长度,然后发送(可能很长)消息。发送此消息时无法接收其他消息(HTTP/2.0试图解决此问题),因此如果您决定忽略此消息,则不能继续等待消息而不提取其数据

通常情况下,我会在垃圾缓冲区中重复读取()直到消息的长度,而忽略字节。但这涉及到将可能数百万字节从内核空间复制到用户空间(每个内存页1个拷贝,所以不是数百万个拷贝)。难道没有办法告诉内核放弃字节而不是提供它们吗


这似乎是一个显而易见的问题,但我能找到的唯一答案是奇怪的资源密集型问题,要么使用splice()将字节转储到管道中并将管道返回到0,要么打开“/dev/null”并使用sendfile()将字节发送到那里。我可以这样做,并保留一个(单个)文件描述符,用于在不读取的情况下从阻塞的连接中刷新数据,但不是只有一个。。。忽略(描述符,长度)函数?

“自版本2.4以来,Linux支持在recv(2)(和recvmsg(2))的flags参数中使用MSG_TRUNC。此标志会导致丢弃接收到的数据字节,而不是在调用方提供的缓冲区中传回。”-?“发送此消息时无法接收其他消息”不正确。您可以使用其他连接。除了关闭套接字之外,没有办法丢弃数据。请注意,使用
MSG_TRUNC
作为
recv()
的输入标志是不可移植的,它只在Linux上工作,而不在其他平台上工作。”由于版本2.4,Linux支持在recv(2)(和recvmsg(2))的flags参数中使用MSG_TRUNC。此标志会导致丢弃接收到的数据字节,而不是在调用方提供的缓冲区中传回。“-?“发送此消息时无法接收其他消息”不正确。您可以使用其他连接。除了关闭套接字之外,无法丢弃数据。请注意,使用
MSG_TRUNC
作为
recv()
的输入标志是不可移植的,它只在Linux上工作,而不在其他平台上工作。