linux接收函数recv

名字
    recv -从一个套接字接收消息
概要
    #include
    #include
    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
描述
    recvfrom()和recvmsg()调用用来从一个套接字接收消息,也可以从不管是否是面向连接的套接字上接收消息。如果src_addr非空,并且基础的协议提供源地址,这个地址将被填充。src_addr为空时,不填充任何东西,这样的话addrlen不用了也为空。addrlen是一个值结果的参数,调用者应该在调用与src_addr关联的缓冲区大小之前初始化,并修改返回值以显示源地址的实际大小。
    recv()函数调用只针对一个已连接的套接字,和src_addr参数为空的recvfrom()函数相同。所有这3个函数返回成功接收的消息的长度,如果一个消息太长了不能匹配提供的缓冲区,多余的字节根据接收到的消息的发送方的套接字类型有可能将被丢弃。如果套接字上无消息可用,接收调用等待消息的到来,除非套接字是非阻塞的,这种情况下将返回-1,errno全局变量设置为EAGAIN或EWOULDBLOCK。接收调用正常返回任何可用的数据,多达请求的大小而不是等待全部请求的数据接收完。
    select()/poll()调用被用来当更多的数据到达时进行判断。recv()的flags参数可以用或的形式组合:
    MSG_CMSG_CLOEXEC(仅用于recvmsg())
    MSG_DONTWAIT 使能非阻塞操作,如果操作阻塞了,调用失败并返回EAGAIN/EWOULDBLOCK(也可以用带O_NONBLOCK标志的fcntl())
    MSG_ERRQUEUE 该标志指定排队的错误应当从套接字错误队列中接收。该错误在由协议决定的配套消息中传送。使用者应该提供一个足够大小的缓冲区。
    MSG_OOB 该标志请求接收不被普通数据流接收的带外数据。一些协议把紧急的数据置于普通数据队列的前面,因此这个标志不能在这些协议中使用。
    MSG_PEEK 该标志导致接收操作从接收队列中返回数据并并不从队列中移除那个数据。因此,随后的接收调用将会接收到同样的数据。
    MSG_TRUNC
    MSG_WAITALL 标志要求操作阻塞直到全部请求都满足了,然而,调用也许仍然会返回比请求少的数据如果捕捉到了一个信号,一个错误或连接断开发生了,或者下一个要接收的数据和返回的数据不同的类型
返回值
    这些调用返回接收到的大小,或者-1如果一个错误发生了的话。当对端有序的关闭了时将返回0

你可能感兴趣的:(linux,用户手册)