Linux下socket常用函数

  1. int socket(int af,int type,int protocol)–用于创建一个套接字
    返回值:成功时返回一个全新的文件描述符,失败时返回-1
    af(address family):ip地址类型,常用宏AF_INET(ipv4),AF_INET6(ipv6)
    type:创建的套接字的类型,常用SOCK_STREAM(流式套接字),SOCK_DGRAM(数据报套接字)
    protocol:表示传输协议,常用IPPROTO_TCP(TCP协议)和IPPROTO_UDP(UDP协议),使用过程中一般填0,除非有两种不同的协议支持同一种地址类型和数据传输类型。

  2. int bind(int sockfd,const struct sockaddr * addr,socklen_t addrlen)–用于服务器端,为套接字绑定网络地址和端口号
    返回值:函数执行成功返回0,否则返回-1, 并设置错误代码。
    sockfd:需要绑定的套接字文件描述符。
    addr:存入网络类型,网络地址和端口号的结构体。
    addrlen:addr结构体的长度。

    注:在实际中,我们通常将struct sockaddr_in这个结构体强转为strcut sockaddr使用
    struct sockaddr_in
    {
    sa_family_t sin_family; //地址类型
    uint16_t sin_port; //16位TCP/UDP端口号
    struct in_addr sin_addr; //32位IP地址
    char sin_zero[8];//保留不使用
    }
    struct in_addr
    {
    In_addr_t s_addr; //32位IPv4地址
    }

绑定时常用转换函数:
htons(host to unsigned short)和htonl(host to unsigned long)
htons用于将unsigned long的数值从小端转换为大端,long有4字节,常用于ipv4地址的转换。

 u_short htons(  u_short hostshort);
 u_long htonl( u_long hostlong);

inet_addr和inet_ntoa
inet_addr用于将ipv4格式的字符串转换为unsigned long的数值。inet_ntoa用于将struct in_addr的地址转换为ipv4格式的字符串。

unsigned long inet_addr( const char* cp);
 char* FAR inet_ntoa( struct   in_addr in);

INADDR_ANY宏
用INADDR_ANY来配置IP地址,意味着不需要知道当前服务器的IP地址。对于多网卡的服务器,INADDR_ANY允许你的服务接收一个服务器上所有网卡发来的数据。下面例子也有写,如果某个socket使用INADDR_ANY和8000端口,那么它将接收该所有网卡传来的数据。而其他socket将无法再使用8000端口。

  1. int listen(int fd, int backlog)–将一个套接字设为监听套接字,使其能够自动接收到来的连接并且为连接队列指定一个长度限制,
    SOCK_STREAM或SOCK_SEQPACKET 类型的套接字。
    返回值:函数执行成功时返回0.错误时返回-1,并置相应错误代码.
    fd:要设置为监听模式的套接字文件描述符。
    backlog:指定未完成连接队列的最大长度.如果一个连接请求到达时未完成连接队列已满,那么客户端将接收到错误ECONNREFUSED.

  2. int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)–与让目标套接字与指定的网络地址和端口号连接
    返回值:函数执行成功返回0,否则返回-1, 并设置错误代码。
    sockfd:可供连接的套接字文件描述符
    addr:用于填写连接目标的网络信息的结构体(参考bind下的使用)
    addrlen:addr结构体长度

  3. int accept(int fd, struct sockaddr *addr, socklen_t *addrlen)–用于基于连接的套接字,它从未完成连接队列中取出第一个连接请求,创建一个和参数fd
    属性相同的连接套接字,并为这个套接字分配一个文件描述符,然后以这个描述符返回
    返回值:若成功则返回一个非负整数标识这个连接套接字,发生错误时返回-1。
    fd:一个正在用于监听功能下的套接字的文件描述符。
    addr:用于储存接受到的客户端的网络信息的结构体(参考bind下的使用)
    addrlen:addr结构体长度

  4. int close(int fd)–立即关闭一个文件描述符,减少资源的开销
    返回值:返回 0 表示成功, 或者-1 表示有错误发生。
    fd:要关闭的文件描述符

  5. int fcntl(int fd, int cmd, … /* arg */ )–控制一个文件描述符的相关属性
    返回值:如果出错,所有命令都返回-1,如果成功则返回某个其他值。下列
    四个命令有特定返回值:F_DUPFD、F_GETFD、F_GETFL、F_GETOWN。
    第一个返回新的文件描述符,接下来的两个返回相应标志,最后一个返回一个正的进程ID或负的进程组ID。
    fd:想要改变设置的文件描述符
    cmd:代表想要操作的命令–
    1)复制一个现有的描述符(cmd=F_DUPFD).
       2)获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
    3)获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
    4)获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).
    5)获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).
    arg:相应命令下的属性参数

  6. ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen)–向指定地址端口发送信息
    返回值:成功时返回发送的字符数,错误时返回-1,并置相应错误代码。
    sockfd:用于发送数据的套接字的文件描述符。
    buf:待发送数据的缓冲区
    len:缓冲区长度
    flags:调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式
    dest_addr:数据接收方的网络信息,如果sokcfd为SOCK_STREAM或SOCK_SEQPACKET属性时,此项可忽略
    addrlen:dest_addr的长度,如果sokcfd为SOCK_STREAM或SOCK_SEQPACKET属性时,此项可忽略

  7. ssize_t send(int sockfd, const void *buf, size_t len, int flags)–向已连接的套接字发送数据
    返回值:成功时返回发送的字符数,错误时返回-1,并置相应错误代码。
    sockfd:用于发送数据的套接字的文件描述符。
    buf:待发送数据的缓冲区
    len:缓冲区长度
    flags:调用方式标志位, 一般为0, 改变Flags,将会改变Send发送的形式

  8. ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen)–从指定地址端口接收数据
    返回值:接收成功时返回接收到的字节数,接收失败时返回-1,并设置错误代码。
    sockfd:用于接收数据的套接字的文件描述符
    buf:接收到的数据的缓冲区
    len:缓冲区长度
    flags:调用操作方式
    src_addr:用于存放数据发送方的网络信息的结构体。
    addrlen:结构体长度

  9. ssize_t recv(int sockfd, void *buf, size_t len, int flags)–从已连接的套接字中接受数据
    返回值:接收成功时返回接收到的字节数,接收失败时返回-1,并设置错误代码。当发送端数据发送完毕断开时,返回0。
    sockfd:已连接的用于接收数据的套接字的文件描述符
    buf:待接收数据的缓冲区
    len:缓冲区长度
    flags:调用操作方式

  10. int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)–可以获得一个与socket相关的地址。服务器端可以通过它得到相关客户端地址。
    而客户端也可以得到当前已连接成功的socket的ip和端口。
    返回值:成功时返回0,失败时返回-1,并设置相应错误代码。
    sockfd:需要获取名称的套接字
    addr:存放所获取套接字名称的缓冲区
    addrlen:作为入口参数,name指向空间的最大长度。作为出口参数,name的实际长度

  11. int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen)–设置某个套接字选项
    返回值:成功时返回0,失败时返回-1,并设置错误代码。
    sock:要设置的套接字对象描述符
    level:选项所在的协议层
    optname:需要设置的选项名
    optval:指向包含新选项值的缓冲
    optlen:现选项的长度

    level常用宏:1)SOL_SOCKET:通用套接字选项.
    2)IPPROTO_IP:IP选项.
    3)IPPROTO_TCP:TCP选项.

  12. int shutdown(int sockfd,int how)–禁止在一个套接口上进行数据的接收与发送。
    返回值:成功则返回0,错误返回-1,错误码errno
    sockfd:要设置的套接字对象描述符
    how:SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。
    SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
    SHUT_RDWR(2):关闭sockfd的读写功能。

  13. int epoll_create(int size)–该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd上是否发生以及发生了什么事件。
    返回值:返回一个监听队列的文件描述符
    size:队列能关注的最大fd数

  14. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)–该函数用于控制某个epoll文件描述符上的事件,可以注册事件,修改事件,删除事件。
    返回值:成功时返回0,失败时返回-1,并设置相应错误代码。
    epfd:由 epoll_create 生成的epoll专用的文件描述符。
    op:要进行的操作例如注册事件,可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除
    fd:关联的文件描述符
    event:指向epoll_event的指针,内核需要监听的事件

 struct epoll_event 
 {
    
    
  __uint32_t events; /* Epoll events */
  epoll_data_t data; /* User data variable */
};
 typedef union epoll_data 
 {
    
    
  void *ptr;
  int fd;
  __uint32_t u32;
  __uint64_t u64;
} epoll_data_t;
events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里
  1. int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)–该函数用于轮询I/O事件的发生;
    返回值:返回发生的事件的个数
    epfd:由epoll_create 生成的epoll专用的文件描述符;
    events:events则是分配好的 epoll_event结构体数组,epoll将会把发生的事件复制到 events数组中
    maxevents:表示本次可以返回的最大事件数目,通常 maxevents参数与预分配的events数组的大小是相等的
    timeout:在没有检测到事件发生时最多等待的时间(毫秒),-1,相当于阻塞,0相当于非阻塞。

猜你喜欢

转载自blog.csdn.net/Fengfgg/article/details/112233678