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 Dos socket.h';函数recvfrom()是否接收单个数据包?_Sockets_Unix - Fatal编程技术网

Sockets Dos socket.h';函数recvfrom()是否接收单个数据包?

Sockets Dos socket.h';函数recvfrom()是否接收单个数据包?,sockets,unix,Sockets,Unix,将其行为总结为“从套接字接收消息”。如果套接字类型为SOCK_STREAM或SOCK_DGRAM,“message”是否与“packet”同义?如果没有,有什么区别 我的第一个想法是,recvfrom可以在流套接字上工作,只是因为没有理由禁止它。正如那句名言所说: “Unix的设计目的不是阻止用户做愚蠢的事情,因为这也会阻止他们做聪明的事情。”-道格·格温 如果它做了我期望它做的事情,您可以像组合使用read()和getpeername()一样使用它,因为它返回发件人的地址。这可能被认为是聪明的

将其行为总结为“从套接字接收消息”。如果套接字类型为SOCK_STREAM或SOCK_DGRAM,“message”是否与“packet”同义?如果没有,有什么区别

我的第一个想法是,
recvfrom
可以在流套接字上工作,只是因为没有理由禁止它。正如那句名言所说:

“Unix的设计目的不是阻止用户做愚蠢的事情,因为这也会阻止他们做聪明的事情。”-道格·格温

如果它做了我期望它做的事情,您可以像组合使用
read()
getpeername()
一样使用它,因为它返回发件人的地址。这可能被认为是聪明的

但后来我在Linux上试过了,但没有成功。源地址缓冲区未更改,长度指示符设置为0

所以现在我不知道该说什么,除了不要在流套接字上使用它。这不是为他们准备的


附录:不,即使在我最疯狂的梦中,我也没想到它能让你访问TCP流中的数据包边界。通过tcp接收机制输入的数据不再由数据包构成。

流套接字没有消息,因此API不可能读取消息。TCP只是没有消息边界。没有消息边界——我想这就是为什么它们被称为流套接字。然而,手册页到处都使用“消息”一词。假设recvfrom在流套接字上工作,那么手册页所指的“消息”是什么?首先为什么要问这个问题?对TCP使用
recv
recvfrom
用于面向消息的协议。试图了解数据包中发送的内容与recv访问的内容之间是否存在1-1对应关系。在我看来,似乎没有,recv可以访问多个数据包的内容。是的,在该页面上,单词
message
的用法令人困惑。网络数据包和
recv()
结果通常不具有1对1的关系,但它取决于基础传输和配置(缓冲区大小、Nagle、消息大小、吞吐量、协议等),并且实际上可以由基础协议保证(请参阅UDP)。“recv()调用通常仅在连接的套接字上使用[…]与recvfrom()相同,带有一个空src_addr参数?我不认为这里的任何人都不清楚
recv
recvfrom
之间的关系。问题是
recv()
recvfrom()
是否可以互换,我用
recv()
手册明确说明的内容对此进行了评论。诚然,我不知道OP在他的问题中是否明确表示
recvfrom()
,因为
recv()
记录在同一页上。我发现的一个手册页表明recv可能在将来被删除,因为它与recvfrom()相同,带有空src\u addr参数。如果我没有看到,我会和recv一起问这个问题。不想混淆。如果recvfrom()返回零,则表示对等方已断开连接。recv()将来被删除的可能性为零。我怀疑你真的读过这样的书。