问题描述
- 关于c中结构体的变量的问题
-
在学习c的socket的时候
看到了 struct sockaddr_in servaddr,clieaddr; //定义了2个结构体变量
之后bind 的时候
if(bind(sockfd,(struct sockaddr *)&servaddr,len)<0)
{
printf("bind errorn");
return -2;
}这里的bind函数的servaddr 小括号里面的结构体变量为什么不是 sockaddr_in 却是不跟下划线的sockaddr
解决方案
socket套接字不止是应用于IPv4 英特网域(AF_INET),sockaddr_in 只是 IPv4因特网域的地址结构,socket还可应用于 IPv6 、UNIX域 等其他通信域。
解决方案二:
sockaddr和sockaddr_in在字节长度上都为16个BYTE,可以进行转换
struct sockaddr {
unsigned short sa_family; //2
char sa_data[14]; //14
};
//上面是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换
struct sockaddr_in {
short int sin_family; //2
unsigned short int sin_port; //2
struct in_addr sin_addr; ‘//4
unsigned char sin_zero[8]; //8
};
通常的做法是:填值的时候使用sockaddr_in结构,而作为函数(如bin, accept, connect等)的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
解决方案三:
那完全是俩类型啊,你看下bind函数的声明地方,用的是什么类型
时间: 2024-11-08 21:11:43