Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.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

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
阻止不接收数据的recv()(TCP)_C_Sockets_Tcp_System Calls_Recv - Fatal编程技术网

阻止不接收数据的recv()(TCP)

阻止不接收数据的recv()(TCP),c,sockets,tcp,system-calls,recv,C,Sockets,Tcp,System Calls,Recv,我正在尝试使用C系统调用编写一个简单的服务器,该调用从未知客户端获取未知字节流,并根据客户端输入执行特定操作。例如,客户端将发送一个命令“乘法2”,服务器将乘法并返回结果 为了避免服务器在客户端写入之前读取的错误,我使用MSG_PEEK调用blocking recv()来等待任何数据。当recv检测到要读取的数据时,我转到非阻塞recv(),它逐字节读取流 除了客户端不发送数据(即write(socket,“,0);)的情况外,其他情况都可以正常工作。我想知道如何准确地检测到没有数据的消息被发送

我正在尝试使用C系统调用编写一个简单的服务器,该调用从未知客户端获取未知字节流,并根据客户端输入执行特定操作。例如,客户端将发送一个命令“乘法2”,服务器将乘法并返回结果

为了避免服务器在客户端写入之前读取的错误,我使用MSG_PEEK调用blocking recv()来等待任何数据。当recv检测到要读取的数据时,我转到非阻塞recv(),它逐字节读取流

除了客户端不发送数据(即write(socket,“,0);)的情况外,其他情况都可以正常工作。我想知道如何准确地检测到没有数据的消息被发送。在这种情况下,recv()将永远阻塞

此外,这篇文章几乎总结了我的问题,但它并没有提出一种检测大小为0的数据包的方法。

send
/
recv
级别使用TCP时,您不了解生成流的数据包流量。当您通过TCP流发送非零字节数时,序列号将增加字节数。这就是双方如何知道对方在成功交换数据方面所处的位置。发送具有相同序列号的多个数据包并不意味着客户端做了任何事情(例如,您的
write(s,”,0)
示例),它只是意味着客户端希望传递其他信息(例如,以另一种方式传输的数据确认)。在流级别操作时,您无法直接看到重传、重复确认或其他类似的异常情况

你链接的答案与此基本相同

除了客户端不发送数据(即write(socket,“,0);)的情况外,其他情况都可以正常工作

write(socket,”,0)
一开始甚至不是发送。它只是一个本地API调用,在网络上什么都不做

我想知道如何准确地检测到没有数据的消息被发送

没有消息发送,因此没有要检测的内容

在这种情况下,recv()将永远阻塞

我同意

我有一个blocking recv()调用,使用MSG_PEEK等待任何数据。当recv检测到要读取的数据时,我转到非阻塞recv(),它逐字节读取流


与使用
recv(MSG_PEEK)
不同,您应该使用
select()
poll()
epoll()
来检测数据何时到达,然后调用
recv()
来读取数据。

write(socket,“,0)
在基于流的协议(如TCP)中没有意义:两者之间没有语义差异(一个1000字节的数据包后跟一个0字节的数据包)、一个1000字节的数据包或两个500字节的数据包,因为它们都是一个1000字节的数据流。你没有“消息”这样的东西,那么你怎么能有“没有数据的消息”呢?!只有当你有某种支持消息的协议时,你才能有消息。你使用什么协议支持消息?我看不到。不相关。他问的是零长度写入。这里没有任何答案。