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

mac2022-06-30  23

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

 

在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类型指针,所以要强制转换下  避免产生警告。

 

 

转载于:https://www.cnblogs.com/XBin/archive/2012/12/16/2853626.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)