struct sockaddr_in s_addr;
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = INADDR_ANY;
s_addr.sin_port = htons(12345); //自定义端口号为12345
len = sizeof(s_addr);
int res = bind(socketfd, (struct sockaddr *)&s_addr, len);
轮子分析:
1、结构体封装了参数,简化了参数地数量,只需要传入一个地址,就传入多个参数;
2、htons:是将整型变量从主机字节顺序转变成网络字节顺序;u_short htons(u_short hostshort);
3、struct sockaddr_in s_addr 结构体实例地方式;
4、三个参数:socketfd,socket 系统句柄; sockaddr_in ,socket参数设置;len,结构体长度,为啥?不能直接函数里面sizeof获取呢?这是个迷
5、命名规范:s_addr 全称socket addr ;
6、
7、res :Response
8、bind:绑定,绑定端口号等;
9、AF_INET:TCP/IP – IPv4
10、INADDR_ANY:定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?
11、s_addr.sin_addr.s_addr:结构体套结构体;
12、必要地参数组合设置
s_addr.sin_family = AF_INET;
s_addr.sin_addr.s_addr = INADDR_ANY;
s_addr.sin_port = htons(12345); //自定义端口号为12345
13、bind返回值 int ,如果没有错误发生,则绑定返回零。 否则,它将返回SOCKET_ERROR,并且可以通过调用WSAGetLastError来检索特定的错误代码。
| 值 | 含义 | 备注
EADDRINUSE 给定地址已经使用
EBADF sockfd不合法
EINVAL sockfd已经绑定到其他地址
ENOTSOCK sockfd是一个文件描述符,不是socket描述符
EACCES 地址被保护,用户的权限不足
EADDRNOTAVAIL 接口不存在或者绑定地址不是本地 UNIX协议族,AF_UNIX
EFAULT my_addr指针超出用户空间 UNIX协议族,AF_UNIX
EINVAL 地址长度错误,或者socket不是AF_UNIX族 UNIX协议族,AF_UNIX
ELOOP 解析my_addr时符号链接过多 UNIX协议族,AF_UNIX
ENAMETOOLONG my_addr过长 UNIX协议族,AF_UNIX
ENOENT 文件不存在 UNIX协议族,AF_UNIX
ENOMEN 内存内核不足 UNIX协议族,AF_UNIX
ENOTDIR 不是目录 UNIX协议族,AF_UNIX
EROFS socket节点应该在制度文件系统上 UNIX协议族,AF_UNIX
14、cpp函数学习链接