红联Linux门户
Linux帮助

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

发布时间:2011-03-10 19:33:46来源:红联作者:hsnowirp
[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型的也编译运行成功了
文章评论

共有 9 条评论

  1. smallhappiness 于 2011-03-11 19:52:06发表:

    学习了

  2. tiany524 于 2011-03-10 22:17:42发表:

    恩 可以这么理解
    呵呵 看多了就好了

  3. hsnowirp 于 2011-03-10 22:13:06发表:

    大概明白了, 呵呵, 我的理解是:
    sockaddr方便函数传递, sockaddr_in方便用户设定, 所以需要的时候就在这2者之间进行转换

    多谢了!

  4. tiany524 于 2011-03-10 22:00:18发表:

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

  5. tiany524 于 2011-03-10 21:59:38发表:

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

  6. 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

  7. hsnowirp 于 2011-03-10 21:50:36发表:

    [i=s] 本帖最后由 hsnowirp 于 2011-3-10 21:55 编辑 [/i]

    引用:
    强制类型转换
    还有个结构体 truct sockaddr_in 与它它一样
    tiany524 发表于 2011-3-10 20:12


    请问为什么要把sockaddr_in强制转换为sockaddr, 这样做的目的是什么? recvfrom和sendto函数只能传递sockaddr类型的吗?

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

  8. tiany524 于 2011-03-10 20:13:12发表:

    struct sockaddr_in

  9. tiany524 于 2011-03-10 20:12:46发表:

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