• 业余爱好者 置顶
    2019-08-07
    unix系统有一种一统天下的简洁之美:一切皆文件,socket也是文件。

    1.像sock_addr的结构体里描述的那样,几种套接字都要有地址族和地址两个字段。这容易理解,你要与外部通信,肯定要至少告诉计算机对方的地址和使用的是哪一种地址。与远程计算机的通信还需要一个端口号。而本地socket的不同之处在于不需要端口号,那么就有了问题2;

    2.本地socket本质上是在访问本地的文件系统,所以自然不需要端口。远程socket是直接将一段字节流发送到远程计算机的一个进程,而远程计算机可能同时有多个进程在监听,所以用端口号标定要发给哪一个进程。
    展开

    作者回复: 回答的很好,给你点赞

     3
     79
  • conanforever22
    2019-08-07
    1. 我觉得这样设计的目的是为了给用户提供一个统一的接口, 不用每个地址族成员都增加个函数原型; 只用通过sockaddr.sa_family来确定具体是什么类型的地址, 有点工厂模式的意思; 如果是C++的话就可以用函数重载来实现了
    2. socket主要还是为了进程间通信, 本地套接字主要用于本地IPC, 网络套接字用于跨机器通信; 如果把socket抽象成文件的话, 通信进程双方需要能够根据一个唯一的fd来找到彼此, 跨机器的话可以用端口, 本地的话直接用文件inode就可以了

    作者回复: 你的理解很到位,工厂模式我倒是没有仔细想过,有点独辟蹊径

     1
     14
  • xcoder
    2019-08-07
    老师能讲下关于WebSocket、Http和socket之间的联系吗?

    作者回复: Http是应用层协议,是基于Tcp socket的实现,websocket是http的增强,利用了Tcp双向的特性,增强了服务器端到客户端的传输能力


    以前客户端是需要不断通过轮询来从服务端得到信息,使用websocket以后就可以服务端直接推送信息到客户端

     1
     11
  • nil
    2019-08-07
    第一问,通用网络地址结构是所有具体地址结构的抽象,有了统一可以操作的地址结构,那么就可以涉及一套统一的接口,简化了接口设计。通用地址结构中第一个字段表明了地址的类型,后面的数据可以通过具体类型解析出来,一般只有将具体地址类型的指针强制转化成通用类型,这样操作才不会造成内存越界。
    第二问,本地socket基于文件操作的,因此只需要根据文件路径便可区分,不需要使用端口的概念。

    作者回复: 正解

     1
     9
  • Sweety
    2019-08-07
    打卡。感觉评论区的人都好厉害。

    作者回复: 我也觉得

    
     5
  • 俩孩儿他爸
    2019-08-10
    个人感觉“Pv4、IPv6、本地套接字格式以及通用地址套接字”的思想类似于OOP中的继承和多态。通用套接子为抽象类,其他套接字实现该抽象类。这样,可以定义基于通用套接字这个抽象类各种通用接口,其他套接字,也就是具体类,可以完全复用这套接口,即,实现了socket编程的多态!

    作者回复: 这个理解我给满分。

     2
     4
  • Linuxer
    2019-08-07
    2字节表示地址族很富裕,知道地址族,基本确定地址结构,通用地址结构,能够很好区分这两部分,一个字符数组就能知道每一种地址结构的起始地址,高明

    作者回复: 回答的也很高明

    
     4
  • (☆_☆)
    2019-08-07
    讲的太好了,越来越懂网络编程了

    作者回复: 渐渐进入状态了

    
     3
  • 衬衫的价格是19美元
    2019-09-30
    通用地址格式sockaddr长度只有16字节,实际存放ip地址的只有14字节,怎么存的下ip6的地址的?这里还是不太明白

    作者回复: 实际上这个通用地址格式,你可以理解为void *,我在文章里也指出了,设计套接字的时候,还没有提供void *类型的指针,所以用通用地址格式来表示。

    在IPV6地址时,实际上传入的还是28个字节的数据,通用地址只是一个"参数类型",在函数处理时,实际上可以根据AF_xxx的类型来判断,真正的地址是IPV6,那么是28个字节的数据需要被使用,而不是16个字节。

     3
     2
  • Kean
    2019-10-12
    第一个问题,各个地址的模式一致,都是标志加数据的组织形式,这种模式有三个好处:一是方便,我们可以用头两个字节知道采用的地址族,进而进行对应的解析;其次是节省空间,不用按照最大长度来使用统一的长度;最后是灵活,各个地址可以自由定义数据部分。这种模式在很多框架里都有运用,比如redis源码里面就大量的用到了这个模式。第二个问题是文件没有端口可言,因为文件路径可以唯一标识文件资源
    
     1
  • 神经蛙
    2019-08-14
    开头那张图,在数据传输过程中,“服务端将得到的结果以相同的方式写给客户端”,那么是否在服务端的write操作应该有个虚线箭头指向客户端的read,就像客户端的write指向服务端read一样?(因为数据传输是双向的)

    作者回复: 没有这样画的意思是read/write是没有直接的对应关系的。

    
     1
  • QQ怪
    2019-08-12
    这篇是讲socket最牛逼的一篇,学到了
    
     1
  • tdytaylor
    2019-08-09
    老师,看了专栏之后,思考后面的问题,发现根本答不上来,看了评论区的一些大牛的解答之后,感觉需要回答这些问题需要很多相关知识(如计算机操作系统),他们的答案感觉是从不同方面回答的,看着都不知道哪个说的更准确。突然觉得之前学的东西太片面了,不能把这些知识串联起,借此希望老师在讲知识点的时候,能稍微提一下,看到不懂的还能把相关知识复习一下,谢谢老师

    作者回复: 好的,我会留意。

    
     1
  • pyhhou
    2019-08-09
    请教老师一下,看完文章,了解了 socket 在 “客户端-浏览器” 这样一个架构中扮演的角色,但是我对 socket 的概念还不是特别理解,不太明白的是,socket 的定义到底是什么?它是和 HTTP、TCP 类似的约定俗成的协议吗?还是说是一个文件,亦或是一段程序代码,里面记录了一些当前网络通信中涉及到的协议、地址、端口号以及其他的一些必要参数?

    作者回复: socket是一个抽象概念,你写代码的时候需要和socket打交道,后面代码片段看到就会明白的。

     1
     1
  • 星亦辰
    2019-08-07
    Listen 和 accept 什么区别 总感觉是一种操作

    作者回复: 其实后面这块设计也被人不断挑战,现实就是有两个操作,其实真的可以搞成一个

     3
     1
  • zhchnchn
    2019-08-07
    请问老师,实际编程中一般使用sockaddr_in,sockaddr_in6,sockaddr_un结构,那么通用套接字地址结构sockaddr的作用是什么?一般在什么场景下使用?

    作者回复: 通用套接字就是所有函数的入口参数,用通用套接字就不需要为Tcp udp等各定义一组socket函数了,前面一位同学总结它为工厂模式,我认为挺到位的

    
     1
  • 萌妻的路飞
    2019-08-07
    c语言还是有点生疏,搜索一下才明白了文中的代码。所以想问下老师,需不需要去补一些c语言,补的话重点看哪些就够了

    作者回复: 基本的函数,指针就可以了

    
     1
  • 小崔
    2019-08-07
    第一:本地地址可变长度有限是否意味着socket路径不能太长
    第二:本地地址通信时,如果两对不同的C/S指定了同一个路径怎么办?后启动的server会报错么?
    第三:本地socket如果是作为文件形式通讯的话,是否会遇到文件权限问题?如果client没有权限访问那个路径也会报错吧

    作者回复: 实践出真知,期待你跑一下真实的程序

    第一,是的,路径是有限制的

    第二,我认为会

    第三,我认为不会

    
     1
  • 大数据小先
    2019-08-07
    1 共性是固定长度,有IP地址和端口号,m这么设计的原因是为了让网络的各个设备通信更加便利,如果没有统一规范,你的是这个格式,他的是那个格式,通信就GG了。

    2 把主机想象成一栋大楼,一个进程就是一户人家,网络通信就是和外面的人互相寄快递,本地的话就邻居之间的交流,外面的人要给你就需要你的地址(IP地址)和户号(端口号)不然快递员不知道送给那家那户。而邻居家之间的,只需要你住在那户(因为有共同地址)就行了。

    期待ing
    展开

    作者回复: 期待你下节课的总结

    
     1
  • 许童童
    2019-08-07
    IPv4、IPv6、本地套接字格式以及通用地址套接字,它们有什么共性呢?如果你是 BSD 套接字的设计者,你为什么要这样设计呢?
    它们的对外接口都是相同的,有bind listen accept connect write send等通用方法,把底层细节屏蔽,为上层使用提供更友好的方式。

    为什么本地套接字格式不需要端口号,而 IPv4 和 IPv6 套接字格式却需要端口号呢?
    本地套接字可以通过套接字文件唯一定位到,而IPv4 和 IPv6要想定位到,就需要使用IP+端口+对方IP+对方端口,四元组来唯一定位到。

    作者回复: 👍

    
     1
我们在线,来聊聊吧