2022-05-02-Linux C 中bind函数用法及注意事项
作者:互联网
Linux C 中bind函数用法详细介绍及注意事项:
对于 C/S 通信模型中
client 端使用的函数顺序通常是 : socket -> connect -> send/recv
server 端使用的函数顺序通常是 : socket -> bind -> listen -> send/recv
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
bind()函数用于服务器端,服务器的网络地址和端口号通常固定不变,客户端得知服务器的地址和端口号以后,可以主动向服务器请求连接。因此服务器需要调用bind()绑定地址。
sockfd表示socket文件的文件描述符,一般为socket函数的返回值;
addr表示服务器的通信地址,本质为struct sockaddr 结构体类型指针,struct sockaddr结构体定义如下
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
};
结构体中的成员,sa_data[]表示进程IP地址;
bind函数中的第三个参数addrlen表示参数addr的长度;addr参数可以接受多种类型的结构体,而这些结构体的长度各不相同,因此需要使用addrlen参数额外指定结构体长度;
可以使用下列语句,定义一个struct sockaddr_in类型的结构体
struct sockaddr_in servaddr;//结构体定义
bzero(&servaddr,sizeof(servaddr));//结构体清零
servaddr.sin_family=AF_INET;//设置地址类型为AF_INET
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//设置网络地址为INADDR_ANY
servaddr.sin_port=htons(80);//设置端口为80
bind(fd, (sockaddr *)(&servaddr), sizeof(servaddr));
如果一个应用并不关心分配给它的地址,则可将Internet地址设置为INADDR_ANY,或将端口号置为0。如果Internet地址段为INADDR_ANY,则可使用任意网络接口。
bind函数调用成功返回0,否则返回-1,并设置errno;
EACCES:地址受到保护,用户非超级用户。
EADDRINUSE:指定的地址已经在使用。
EBADF:sockfd参数为非法的文件描述符。
bind属性设置
默认情况下,一个端口是不允许重复绑定的。
linux中socket可以通过以下设置来允许端口重复绑定:
unsigned int yes = 1;
setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes))
如果ClientA先bind 端口C, ClientB再bind 端口C, 那么发往端口C的数据只有ClientB才能收到。
查看端口绑定命令
linux 命令: netstat -anu
if((sockfd=socket(AF_INET,SOCK_DGRAM,0)==-1)) 总是运行报错。
同一优先级的运算符,运算次序由结合方向所决定。简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
谢谢大佬,errno 88,搞定了,套接字创建那里括号放错位置导致优先级有问题,搞定了。
标签:02,sockaddr,socket,05,bind,addr,servaddr,struct 来源: https://www.cnblogs.com/YiMingXiaoBuYiMengXiaoNai/p/Linux-C-bind-function.html