2 liyuef123 liyuef123 于 2016.03.26 20:07 提问

关于c中结构体的变量的问题 1C

在学习c的socket的时候
看到了 struct sockaddr_in servaddr,clieaddr; //定义了2个结构体变量
之后bind 的时候
if(bind(sockfd,(struct sockaddr *)&servaddr,len)<0)
{
printf("bind error\n");
return -2;
}

这里的bind函数的servaddr 小括号里面的结构体变量为什么不是 sockaddr_in 却是不跟下划线的sockaddr

3个回答

Dennis_Zip
Dennis_Zip   2016.03.26 20:57

socket套接字不止是应用于IPv4 英特网域(AF_INET),sockaddr_in 只是 IPv4因特网域的地址结构,socket还可应用于 IPv6 、UNIX域 等其他通信域。

qq423399099
qq423399099   Ds   Rxr 2016.03.26 21:59

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个字符长。

lx624909677
lx624909677   Ds   Rxr 2016.03.27 23:42

那完全是俩类型啊,你看下bind函数的声明地方,用的是什么类型

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!