[i=s] 本帖最后由 hsnowirp 于 2011-3-10 21:45 编辑 [/i]
recvfrom函数里面的,源代码是:[code]len = recvfrom(sock, buff, sizeof(buff), 0, (struct sockaddr *) &client_addr, &addr_len);[/code](struct sockaddr *) &client_addr应该是收到的客户端的sockaddr,我把括号里面的去掉了,直接用&client_addr也编译运行成功了
那么请问(struct sockaddr *)有什么作用?(struct sockaddr *)和&client_addr之间要有空格吗?
还有个疑问: 在源程序的开头, 声明变量, 有个是 socklen_t addr_len; 请问这个是什么类型的?
我把它改为int型的也编译运行成功了
smallhappiness 于 2011-03-11 19:52:06发表:
学习了
tiany524 于 2011-03-10 22:17:42发表:
恩 可以这么理解
呵呵 看多了就好了
hsnowirp 于 2011-03-10 22:13:06发表:
大概明白了, 呵呵, 我的理解是:
sockaddr方便函数传递, sockaddr_in方便用户设定, 所以需要的时候就在这2者之间进行转换
多谢了!
tiany524 于 2011-03-10 22:00:18发表:
这是我的理解
以前的东西也是这么做的
很多人的代码也是这么写的
tiany524 于 2011-03-10 21:59:38发表:
对 struct sockaddr_in 操作完毕后
再转换回来 传递给 recvfrom
tiany524 于 2011-03-10 21:58:23发表:
struct sockaddr
数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 struct sockaddr_in
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了
关于这两个结构体晚上内容很多
核心就是
一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构 struct sockaddr_in
hsnowirp 于 2011-03-10 21:50:36发表:
[i=s] 本帖最后由 hsnowirp 于 2011-3-10 21:55 编辑 [/i]
请问为什么要把sockaddr_in强制转换为sockaddr, 这样做的目的是什么? recvfrom和sendto函数只能传递sockaddr类型的吗?
另外, 如果我这样强制转换类型(struct sockaddr), 就会出错, (struct sockaddr *)指针类型的转换内存中是如何进行的呢?
tiany524 于 2011-03-10 20:13:12发表:
struct sockaddr_in
tiany524 于 2011-03-10 20:12:46发表:
强制类型转换
还有个结构体 truct sockaddr_in 与它它一样