关于Linux C编程问题 (struct sockaddr*)&addr 强制转换


很久前写的了,现在搬到这来了,现在看看此问题确实不是什么大问题~~

 

在Linux  C 编程中 经常遇到的一个让我有点费解的看似不难的一个小问题,,,求解释。
答:如在SOCKET编程中的函数int bind(int sockfd,struct sockaddr*myaddr,int addrlen)中的的二个参数struct sockaddr*myaddr是一个指向结构体的指针,对吧?调用bind()程序如下bind(sockfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in))  ,(addr是自己定义的一个struct sockaddr_in结构体)
-------------------------------
我想问 (struct sockaddr*)&addr是什么意思???为什么前面加上(struct sockaddr*)???
是强制转换吗???强制转换成什么???为什么要强制转换???直接&addr不可以吗???
答:struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。
int bind(int sockfd,struct sockaddr*myaddr,int addrlen);
声明了此种结构体,避免编译警告,强制类型转换。对于追求完美的程序员肯定要避免任何警告。严谨的代码风格。虽然两个结构体是两种概念的统一表达方式。具体参考apue socket编程。

++++刚刚又看了会书和代码,再看看你给的这些解释,感觉思维通了~  在定义addr时,使用的是struct sockaddr_in addr,而函数bind()中的那个参数是struct sockaddr类型指针,所以要强制转换下  避免产生警告。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM