套接字api1.socketsocket函数原型分析的分析

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

int inet_pton(int family, const char *strptr, void *addrptr); 

剖析:

 const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len); 

剖析:

strcutsockaddr好多网路编程函数诞生早于IPv4合同,那时侯都使用的是sockaddr结构体,为了往前兼容,如今sockaddr退化成了(void*)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,之后函数内部再强制类型转化为所需的地址类型。

图片[1]-套接字api1.socketsocket函数原型分析的分析-唐朝资源网

1.socketaddr_in结构体:

struct sockaddr_in
{
    sa_family_t    sin_family; /* address family: AF_INET */

    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};
 
struct in_addr 
{
    uint32_t       s_addr;     /* address in network byte order */

};

套接字api

图片[2]-套接字api1.socketsocket函数原型分析的分析-唐朝资源网

1.socket函数原型:

int socket(int domain, int type, int protocol);

剖析:

图片[3]-套接字api1.socketsocket函数原型分析的分析-唐朝资源网

int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

剖析:

【注意】:服务器程序所窃听的网路地址和端标语一般是固定不变的,顾客端程序得悉服务器程序的地址和端标语后就可以向服务器发起联接,为此服务器须要调用bind绑定一个固定的网路地址和端标语。bind()的作用是将参数sockfd和addr绑定在一起api获取套接字信息,使sockfd这个用于网路通信的文件描述符窃听addr所描述的地址和端标语。上面讲过,structsockaddr*是一个通用表针类型,addr参数实际上可以接受多种合同的sockaddr结构体,而它们的宽度各不相同,所以须要第三个参数addrlen指定结构体的厚度。如:

struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(6666);

首先将整个结构体清零,之后设置地址类型为AF_INET,网路地址为INADDR_ANY,这个宏表示本地的任意IP地址,由于服务器可能有多个网卡,每位网卡也可能绑定多个IP地址,这样设置可以在所有的IP地址上窃听,直至与某个顾客端构建了联接时才确定出来究竟用那个IP地址,端标语为6666

int listen(int sockfd, int backlog);

【注意】:典型的服务器程序可以同时服务于多个顾客端,当有顾客端发起联接时,服务器调用的accept()返回并接受这个联接,假如有大量的顾客端发起联接而服务器来不及处理,仍未accept的顾客端就处于联接等待状态,listen()申明sockfd处于窃听状态,而且最多容许有backlog个顾客端处于连接待状态,假如接收到更多的联接恳求就忽视。listen()成功返回0,失败返回-1。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

函数原型:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

剖析:

【注意】:顾客端须要调用connect()联接服务器,connect和bind的参数方式一致,区别在于bind的参数是自己的地址api获取套接字信息,而connect的参数是对方的地址。connect()成功返回0,出错返回-1。

© 版权声明
THE END
喜欢就支持一下吧
点赞117赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容