请问(struct sockaddr *) &client_addr是什么意思?

本帖最后由 hsnowirp 于 2011-3-10 21:45 编辑

recvfrom函数里面的,源代码是:
  1. len = recvfrom(sock, buff, sizeof(buff), 0, (struct sockaddr *) &client_addr, &addr_len);
复制代码
(struct sockaddr *) &client_addr应该是收到的客户端的sockaddr,我把括号里面的去掉了,直接用&client_addr也编译运行成功了
那么请问(struct sockaddr *)有什么作用?(struct sockaddr *)和&client_addr之间要有空格吗?

还有个疑问: 在源程序的开头, 声明变量, 有个是 socklen_t addr_len; 请问这个是什么类型的?
我把它改为int型的也编译运行成功了

作者: hsnowirp   发布时间: 2011-03-10

强制类型转换
还有个结构体 truct sockaddr_in 与它它一样

作者: tiany524   发布时间: 2011-03-10

struct sockaddr_in

作者: tiany524   发布时间: 2011-03-10

本帖最后由 hsnowirp 于 2011-3-10 21:55 编辑
强制类型转换
还有个结构体 truct sockaddr_in 与它它一样
tiany524 发表于 2011-3-10 20:12
请问为什么要把sockaddr_in强制转换为sockaddr, 这样做的目的是什么? recvfrom和sendto函数只能传递sockaddr类型的吗?

另外, 如果我这样强制转换类型(struct sockaddr), 就会出错, (struct sockaddr *)指针类型的转换内存中是如何进行的呢?

作者: hsnowirp   发布时间: 2011-03-10

struct sockaddr
数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 struct sockaddr_in
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了

关于这两个结构体晚上内容很多
核心就是
一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 struct sockaddr_in

作者: tiany524   发布时间: 2011-03-10

对 struct sockaddr_in 操作完毕后
再转换回来  传递给 recvfrom

作者: tiany524   发布时间: 2011-03-10

这是我的理解  
以前的东西也是这么做的
很多人的代码也是这么写的

作者: tiany524   发布时间: 2011-03-10