很久前写的了,现在搬到这来了,现在看看此问题确实不是什么大问题~~
问:在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类型指针,所以要强制转换下 避免产生警告。