Linux网络函数
发布日期:2021-05-07 02:41:59 浏览次数:24 分类:精选文章

本文共 2413 字,大约阅读时间需要 8 分钟。

socket模型流程

在这里插入图片描述注意:如果不使用bind绑定客户端地址结构, 采用"隐式绑定".

  • TCP/IP协议规定:网络字节流采用大端字节序(电脑中一般是小段存储)
      (1):大端:低地址 -> 高字节
      (1):小端:低地址 -> 低字节
  • linux下的转换函数

(1)字节序的转换

#include 
uint32_t htonl(uint32_t hostlong);//本地(host)到网络 (network)ip uint16_t htons(uint16_t hostshort); // 本地到网络 port uint32_t ntohl(uint32_t netlong); //网络到本地 ip uint16_t ntohs(uint16_t netshort); //网络到本地port

(2)字符串IP和网络字节序转换

#include
/*af: IP版本 AF_INET->Ipv4 AF_INET->Ipv6 src:要转的字符串 dst:网络地址的结构体指针*/int inet_pton(int af, const char *src, void *dst);//字符串 -> 网络字节序/*af: IP版本 AF_INET->Ipv4 AF_INET->Ipv6 src:要转的网络字节序 dst:指向存放ip字符串的buf size:buf的大小*/const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//网络字节序 -> 字符串
  • sockaddr数据结构

在这里插入图片描述

在申明结构体的时候使用sockaddr_in,在传递参数的时候使用强制转换(sockaddr *)

//以前版本struct sockaddr {   	sa_family_t sa_family; 		        /* address family, AF_xxx */	char sa_data[14];			/* 14 bytes of protocol address */};//现在版本struct sockaddr_in {   	sa_family_t              sin_family; 			/* Address family : AF_INET*/  	地址结构类型	in_port_t                sin_port;		        /* Port number in network byte order  */		端口号	struct in_addr           sin_addr;			/* Internet address */	IP地址};struct in_addr {   							uint32_t    s_addr;        /* Internet address in network byte order*/};
struct sockaddr_in addr;	addr.sin_family=AF_INET;	addr.sin_port=htons(8888);	addr.sin_addr.s_addr=htonl(INADDR_ANY);

(1)socket函数:创建套接字

/*domain: AF_INET | AF_INET6 | AF_UNIX(本地)type: SOCK_STREAM(流式) | SOCK_DGRAM(报式)protocol: 0(默认,自动选择流式or报式典型协议:tcp | udp)成功:返回指向新创建的socket的文件描述符*/socket(int domain, int type, int protocol)

(2)bind函数:绑定IP+Port

/*sockfd:需要绑定的socket文件描述符addr:(传入参数)指定自己的IP地址和端口号addrlen:结构体大小成功:0失败:-1 errno*/int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen)

(3)listen函数:设置服务器同时允许客户端建立连接的数目

/*sockfd : socket文件的描述符backlog : 指定同时建立连接的客户端数目(上限数值)成功:0失败:-1 errno*/int listen(int sockfd, int backlog)

(4)accept函数:接收一个socket连接请求(阻塞监听)

阻塞等待客户端建立连接,成功的话,返回一个与客户端成功连接的socket文件描述符

/*sockfd:socket函数返回值addr: (传出参数)成功与服务器建立连接的那个客户端的地址结构(用来存放客户端IP+Port信息)addrlen: 传入、传出参数,传入addr结构体的大小,传出真正的结构体内部大小返回值:	成功:能与服务进行数据通信的socket对应的文件描述符	失败:-1 errno*/int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)

(5)connect函数:使用现有的socket与服务器建立连接

/*sockfd: 客户端本地的socket文件描述符addr:(传入参数)服务器的IP+Port结构体信息addrlen:传入参数 sizeof(addr)返回:	成功:0	失败:*/connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
上一篇:linux基础
下一篇:getsockname

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 03时19分49秒