关于socket的一些疑问

来源:互联网 发布:森林鸟旗舰店淘宝 编辑:程序博客网 时间:2024/05/02 02:06

Q: accept接受socket的描述符作为参数,之后返回另一个socket描述符,那这两个socket有什么区别和联系? 假如调用之前的socket绑定在8000端口,那返回之后的socket是不是也绑定在8000端口?一个端口可以绑定几个socket吗?

A:socket看成IP+端口,server的IP x:8000 是那个在listen的socket做参数传给accept,从这个socket可以得到一些访问它的英特网用户,它们就是那个返回的socket,比如y:4321,然后你可以用其它的线程和这个socket通信,收和发,它代表已经连接的链路。画个图


                   server [ 192.168.1.128 : 8080 ] state: listening



        |            |            |       ......              |
    client1      client2       client3     ......     clientx [ 10.0.1.255 : 1234 ]

       一开始是client知道server的IP,或者用DNS解析后的IP,和某种协议固定的端口号,然后发送连接请求,client会一直用那个socket[ 192.168.1.128 : 8080 ]和server通信(可能协议还会建立其它链路,只一般情况),而server会用client的IP和某个端口进行通信,那就是accept返回的socket。
       我们打电话的时候,都要拿着一头的话筒,那个话筒连接着对方(技术细节忽略),通话的双方都拿着和对方相连的话筒,这两个socket是不同的,都代表着对方。

       不是一个端口可以绑定几个socket,就只有一个IP的计算机来说,终端,它可以有很多服务,每一个服务或者进程会使用不同的端口,比如同一个办公楼层不同的房间号码,在应用层,能够通信的对象变成了‘进程’,只考虑进程间的网络通信,而端口就是用来分发给进程用的,OS收到了TCP包,把端口号取出来,再送到相应的进程并通知它进行处理。accept返回的,收到的socket是对方client的IP+端口号,和你自己的进程占用的端口号不相关,这些端口号是确保你发送的信息会正确的到达对方的机器上的正确的进程中去。

0 0
原创粉丝点击