×

recvfrom和recv recv

recvfrom和recv(linux手册翻译——recv(2))

admin admin 发表于2024-06-03 14:12:05 浏览18 评论0

抢沙发发表评论

大家好,今天小编来为大家解答以下的问题,关于recvfrom和recv,linux手册翻译——recv(2)这个很多人还不知道,现在让我们一起来看看吧!

本文目录

linux手册翻译——recv(2)

recv, recvfrom, recvmsg - receive a message from a socket

recv()、recvfrom() 和 recvmsg() 调用用于从套接字接收消息。 它们可用于在UDP和TCP的套接字上接收数据。 本页首先介绍了所有三个系统调用的共同特点,然后介绍了调用之间的区别。

recv() 和 read(2) 之间的唯一区别是 flags 的存在。 使用零标志参数,recv() 通常等效于 read(2) (但请参阅 NOTES),且 recv(sockfd, buf, len, flags); 等价于 recvfrom(sockfd, buf, len, flags, NULL, NULL);

所有三个调用都在成功完成时返回消息的长度。 如果消息太长而无法放入提供的缓冲区,则 可能 会丢弃多余的字节,具体 取决于接收消息的套接字类型 ,显然TCP是不可能丢弃的。

如果套接字上没有可用消息,则接收调用将等待消息到达,除非套接字是非阻塞的(请参阅 fcntl(2)),在这种情况下,将返回值 -1 并将 errno 设置为 EAGAIN 或 EWOULDBLOCK。 recv_()调用通常会返回任何可用的数据,只要拿到数据就会立马返回,最多返回指定缓冲区大小的数据,但是并不会等待到让缓冲区满 ,除非设置了 MSG_WAITALL 标志,见下。

应用程序可以使用 select(2)、poll(2) 或 epoll(7) 来确定更多数据何时到达。

The flags argument is formed by ORing one or more of the following values:

ee_errno contains the errno number of the queued error. ee_origin is the origin code of where the error originated. The other fields are protocol-specific. The macro SOCK_EE_OFFENDER returns a pointer to the address of the network object where the error originated from given a pointer to the ancillary message. If this address is not known, the sa_family member of the sockaddr contains AF_UNSPEC and the other fields of the sockaddr are undefined. The payload of the packet that caused the error is passed as normal data. For local errors, no address is passed (this can be checked with the cmsg_len member of the cmsghdr ). For error receives, the MSG_ERRQUEUE flag is set in the msghdr . After an error has been passed, the pending socket error is regenerated based on the next queued error and will be passed on the next socket operation.

recvfrom() 将接收到的消息放入缓冲区 buf 。 调用者必须在 len 中指定缓冲区的大小。

如果调用者希望拿到消息的原地址, 并且底层协议可以提供消息的源地址时,应将 src_addr 设置为指向用于接收消息原地址的缓冲区。 在这种情况下, addrlen 是一个 value-result 参数。 在调用之前,它应该被初始化为与 src_addr 关联的缓冲区的大小。 返回时,addrlen 被更新以包含源地址的实际大小。 如果提供的缓冲区太小,则截断返回的地址; 在这种情况下, addrlen 将返回一个大于提供给调用的值。

如果调用者对源地址不感兴趣,则应将 src_addr 和 addrlen 指定为 NULL。

ssize_t recv(int sockfd, void* buf, size_t len, int flags); recv() 调用通常仅用于已连接的套接字(请参阅 connect(2))。 相当于调用: recvfrom(fd, buf, len, flags, NULL, 0);

ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags); recvmsg() 调用使用 msghdr 结构来 最小化直接提供的参数数量 。 这个结构在 《sys/socket.h》 中定义如下:

msg_name 字段指向调用者分配的缓冲区,如果套接字未连接( 特指UDP的服务端 ),则该缓冲区用于返回源地址。 调用者应在此调用之前将 msg_namelen 设置为此缓冲区的大小; 从成功调用返回后,msg_namelen 将包含返回地址的长度。 如果应用程序不需要知道源地址,可以将 msg_name 指定为 NULL。

The fields msg_iov and msg_iovlen describe scatter-gather locations, as discussed in readv(2). 需要注意的是 msg_iov 和 msg_iovlen 描述了一个 struct iovec 类型的数组, msg_iovlen 表示数组的元素个数,而struct iovec则是描述了一个缓冲区

字段 msg_control 指向用于其他协议控制相关消息或杂项辅助数据的缓冲区。 当recvmsg()被调用时, msg_controllen 为 msg_contro l中可用缓冲区的长度; 从成功调用返回时,它将被设置为控制消息序列的长度。

控制消息的格式为:

只能通过 cmsg(3) 中定义的宏访问辅助数据。

例如,Linux 使用这种辅助数据机制通过 UNIX 域套接字传递扩展错误、IP 选项或文件描述符。 有关在各种套接字域中使用辅助数据的更多信息,请参阅 unix(7) 和 ip(7)。

msghdr 中的 msg_flags 字段在 recvmsg() 返回时设置 。 它可以包含几个标志:

这些调用返回接收到的字节数,如果发生错误,则返回 -1。 如果发生错误,则设置 errno 以指示错误。

当流套接字对等端执行有序关闭(orderly shutdown)时,返回值将为 0(传统的“文件结束”返回)。

各种域(例如 UNIX 和 Internet 域)中的数据报套接字允许零长度数据报。 当收到这样的数据报时,返回值为 0。

如果从流套接字接收的请求字节数为 0,则也可能返回值 0。

这些是套接字层生成的一些标准错误。 底层协议模块可能会产生和返回额外的错误; 查看他们的手册页。

POSIX.1-2001, POSIX.1-2008, 4.4BSD (these interfaces first appeared in 4.2BSD).

POSIX.1 describes only the MSG_OOB, MSG_PEEK, and MSG_WAITALL flags.

如果零长度数据报未决,则带有零标志参数的 read(2) 和 recv() 提供不同的行为。 在这种情况下, read(2) 不起作用(数据报保持挂起),而 recv() 消耗挂起的数据报。

socklen_t 类型是由 POSIX 发明的。 另见 accept(2) 。

根据 POSIX.1,msghdr 结构的 msg_controllen 字段类型为 socklen_t,而 msg_iovlen 字段类型为 int,但 glibc 目前将两者设置为 size_t。

有关可用于在单个调用中接收多个数据报的 Linux 特定系统调用的信息,请参阅 recvmmsg(2)。

getaddrinfo(3) 中显示了使用 recv() 的示例。

请教recv 和 recvfrom的区别

不太清楚,recv一般用于tcp,因为tcp有有链接的,在recv调用中不需要知道对方是谁。recvfrom一般用于udp,参数中可以传回对方是谁的信息。

recv()和recvfrom()有什么区别

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

从某处或某人那收到(款项)。

recvfrom()的recvfrom

recvfrom  recvfrom函数(经socket接收数据):函数原型:int recvfrom(SOCKET s,void *buf,int len,unsigned int flags, struct sockaddr *from,int *fromlen);相关函数 recv,recvmsg,send,sendto,socket函数说明:recv()用来接收远程主机经指定的socket传来的数据,并把数据传到由参数buf指向的内存空间,参数len为可接收数据的最大长度.参数flags一般设0,其他数值定义参考recv().参数from用来指定欲传送的网络地址,结构sockaddr请参考bind()函数.参数fromlen为sockaddr的结构长度.返回值:成功则返回接收到的字符数,失败返回-1.错误代码EBADF 参数s非合法的socket处理代码EFAULT 参数中有一指针指向无法存取的内存空间。ENOTSOCK 参数s为一文件描述词,非socket。EINTR 被信号所中断。EAGAIN 此动作会令进程阻断,但参数s的socket为不可阻断。ENOBUFS 系统的缓冲内存不足ENOMEM 核心内存不足EINVAL 传给系统调用的参数不正确。范例/*利用socket的UDP client此程序会连线UDP server,并将键盘输入的字符串传给server。UDP server 范例请参考sendto()。*/#include《sys/stat.h》#include《fcntl.h》#include《unistd.h》#include《sys/typs.h》#include《sys/socket.h》#include《netinet/in.h》#include《arpa/inet.h》#define PORT 2345#define SERVER_IP “127.0.0.1”main(){int s,len;struct sockaddr_in addr;int addr_len =sizeof(struct sockaddr_in);char buffer;/* 建立socket*/if((s = socket(AF_INET,SOCK_DGRAM,0))《0){perror(“socket”);exit(1);}/* 填写sockaddr_in*/bzero(&addr,sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.s_addr = inet_addr(SERVER_IP);while(1){bzero(buffer,sizeof(buffer));/* 从标准输入设备取得字符串*/len =read(STDIN_FILENO,buffer,sizeof(buffer));/* 将字符串传送给server端*/sendto(s,buffer,len,0,&addr,addr_len);/* 接收server端返回的字符串*/len = recvfrom(s,buffer,sizeof(buffer),0,&addr,&addr_len);printf(“receive: %s”,buffer);}}执行 (先执行udp server 再执行udp client)hello /*从键盘输入字符串*/receive: hello /*server端返回来的字符串*/

以上就是我们为大家找到的有关“recvfrom和recv(linux手册翻译——recv(2))”的所有内容了,希望可以帮助到你。如果对我们网站的其他内容感兴趣请持续关注本站。