recv()和recvfrom()区别是:含义不同、用法不同、侧重点不同
一、含义不同
recv
abbr. 接收;收到(receive)。
recv from
收到来自…。
二、用法不同
recv
receive的基本意思是“接受”“收到”,仅指接到或收到某物的客观事实,而不表示主观态度(接受或拒绝)。引申表示“受到教育、惩罚、支持等”“赞同某一意见或看法”。有时还可表示“接见某人”。
Ipfw add allow tcp from to in recv.
添加和除去规则例子:。
L2TP : Zero check error when recv call control message.
第三个表明收到的控制报文中存在应该为0的位不为0的情况。
The placeholder prefix is SEND for Send connectors or RECV for Receive connectors.
占位符prefix为SEND(对于发送连接器)或RECV(对于接收连接器)。
recv from
receive from/of的意思是“从某处或某人那收到(款项)”,如received from/of Sam seven pounds。
I received a cable from New York.
我收到一封从纽约来的电报。
We receive a fax of the order this morning.
我们今天上午收到一份传真订单。
Do you save letters and cards that you receive from friends and relatives?
您有收藏您所收到的朋友的和亲人的信件、卡片吗?
三、侧重点不同
recv
仅指接到或收到某物的客观事实,而不表示主观态度(接受或拒绝)。
recv from
从某处或某人那收到(款项)。
python设计UDP通信时,recvfrom()中的参数是什么意思
recvfrom函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
本函数用于从(已连接)套接口上接收数据,并捕获数据发送源的地址。
对于SOCK_STREAM类型的套接口,最多可接收缓冲区大小个数据。如果套接口被设置为线内接收带外数据(选项为SO_OOBINLINE),且有带外数据未读入,则返回带外数据。应用程序可通过调用ioctlsocket()的SOCATMARK命令来确定是否有带外数据待读入。对于SOCK_STREAM类型套接口,忽略from和fromlen参数。
对于数据报类套接口,队列中第一个数据报中的数据被解包,但最多不超过缓冲区的大小。如果数据报大于缓冲区,那么缓冲区中只有数据报的前面部分,其他的数据都丢失了,并且recvfrom()函数返回WSAEMSGSIZE错误。
若from非零,且套接口为SOCK_DGRAM类型,则发送数据源的地址被复制到相应的sockaddr结构中。fromlen所指向的值初始化时为这个结构的大小,当调用返回时按实际地址所占的空间进行修改。
如果没有数据待读,那么除非是非阻塞模式,不然的话套接口将一直等待数据的到来,此时将返回SOCKET_ERROR错误,错误代码是WSAEWOULDBLOCK。用select()或WSAAsynSelect()可以获知何时数据到达。

如果套接口为SOCK_STREAM类型,并且远端“优雅”地中止了连接,那么recvfrom()一个数据也不读取,立即返回。如果立即被强制中止,那么recv()将以WSAECONNRESET错误失败返回。
使用recvfrom接收UDP包在Windows和Linux平台的不同表现
socket.recvfrom(bufsize[, flags])
Receive data from the socket. The return value is a pair (bytes, address) where bytes is a bytes object
representing the data received and address is the address of the socket
sending the data. See the Unix manual page recv(2) for
the meaning of the optional argument flagsit defaults to zero. (The
format of address depends on the address family — see above.)
recvfrom(1)就是从缓冲区读一个字节的数据
操作系统的UDP接收流程如下:收到一个UDP包后,验证没有错误后,放入一个包队列中,队列中的每一个元素就是一个完整的UDP包。当应用程序通过recvfrom()读取时,OS把相应的一个完整UDP包取出,然后拷贝到用户提供的内存中,物理用户提供的内存大小是多少,OS都会完整取出一个UDP包。如果用户提供的内存小于这个UDP包的大小,那么在填充慢内存后,UDP包剩余的部分就会被丢弃,以后再也无法取回。
这与TCP接收完全不同,TCP没有完整包的概念,也没有边界,OS只会取出用户要求的大小,剩余的仍然保留在OS中,下次还可以继续取出。
socket编程虽然是事实上的标准,而且不同平台提供的接口函数也非常类似,但毕竟它不存在严格的标准。所以各个平台的实现也不完全兼容。下面就从recvfrom()这个函数看看Window平台和Linux平台的不同。
Windows平台的表现
int
WSAAPI
recvfrom(
_In_ SOCKET s,
_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,
_In_ int len,
_In_ int flags,
_Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR * from,
_Inout_opt_ int FAR * fromlen
)
再看MSDN说明:
If the datagram or message is larger than the buffer specified, the buffer is filled with the first part of the datagram, and recvfrom generates the error WSAEMSGSIZE. For unreliable protocols (for example, UDP) the excess data is lost.
可以看出,buf大小小于UDP包大小的时候,recvfrom()会返回-1,并设置错误WSAEMSGSIZE。
实际编程测试验证确实是这样的表现。
Linux平台的表现
__extern_always_inline ssize_t
recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,
__SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
可以看出与Windows平台的函数原型相同。但是在其man手册里,没有看到UDP包大于接收缓冲区情况的特殊说明。
写代码测试表明,buf小于UDP包大小的时候,recvfrom()仍然返回复制到缓冲区的字节数,调用者无法得知UDP包被截断的情况。
以上就是关于recv()和recvfrom()有什么区别?全部的内容,如果了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!