zoukankan      html  css  js  c++  java
  • Linux内核分析:recv、recvfrom、recvmsg函数实现

    先看一下这三个函数的声明:

    1 #include <sys/types.h>
    2 #include <sys/socket.h>
    3 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
    4 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    5 ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

    1、这个三个函数都是用来从一个socket接收消息的,不同之处在于recvfrom和recvmsg可以用在已经建立连接的socket,也可以用在没有建立连接的socket,关于建立连接的socket,简单来说就是有没有调用connect,调用了bind的socket也可以。

    2、addrlen是一个value-result参数,传入函数之前初始化为src_addr的大小,返回之后存放src_addr实际大小。

    3、三个函数的返回值都是成功读取的消息的长度,如果一个消息的长度大于buffer的长度,多余的字节根据socket的类型可能会被丢弃(例如UDP)。

    4、如果没有消息可读,这个三个函数会阻塞直到有数据;或者可以设置为非阻塞的,在这种情况下返回-1,同时errno被设置为EAGAIN或者EWOULDBLOCK。

    5、如果返回值为0,表示对端已经关闭。

     函数实现:

  • 相关阅读:
    BZOJ BLO 1123 (割点)【双连通】
    P4291 [HAOI2008]排名系统
    P3165 [CQOI2014]排序机械臂
    P3224 [HNOI2012]永无乡
    P1169 [ZJOI2007]棋盘制作
    P2303 [SDOi2012]Longge的问题
    P2216 [HAOI2007]理想的正方形
    P2473 [SCOI2008]奖励关
    P2617 Dynamic Rankings
    P2518 [HAOI2010]计数
  • 原文地址:https://www.cnblogs.com/lit10050528/p/6274787.html
Copyright © 2011-2022 走看看