回 帖 发 新 帖 刷新版面

主题:[讨论]问一下关于socket的几个问题

1. bind 和 accept 都用到 sockaddr结构,不过这个结构通常用sockaddr_in替代, 我想问下一下sockaddr和sockaddr_in有什么区别,当初为什么要这样设计?

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

这个顺便问问, 在shell脚本中,我想用变量存起命令执行后的字串,应该怎么做?

回复列表 (共5个回复)

沙发

2,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+端口号,和你自己的进程占用的端口号不相关,这些端口号是确保你发送的信息会正确的到达对方的机器上的正确的进程中去。

3 楼

第二个问题基本解决。多谢。我另外也查过些资料。
说IP协议解释地址,UDP在IP的基础上添上端口的概念,TCP保证连接。IP是一层,UCP/TCP是IP之上的一层,可以想象socket是TCP之上的又一层抽象。这种说法有没有错误?

至于第一个问题,还没有完全想通。我看到sockaddr_in这结构后面都是填充零,没有别的含义,只是为了和scokaddr保持字节一样。以后用IPv6可能这些额外的字段有别的含义。

那个shell的问题已经知道了。

4 楼

第一个问题可能和网络字节顺序有关.

IP层是网络层,解决的是路由问题,就是并不是从一个结点到下一个结点的发送信息,而是在网络上的子网到其它子网以及子网下的终端之间的路由,实现从'网卡'到'网卡'的通信,当然是指在英特网中的计算机上的网卡;而传送层,主要是TCP和UDP,是解决数据的正确传送的,当然和端口有关,但不讨论应用层的具体协议,比如什么协议应该是什么端口,当收到什么请求是要有什么状态改变和回应等.UDP只是IP的简单封装,是不保证正确传送的,而TCP是面向连接的,主要保证数据的正确传送.

5 楼

多谢了。我刚借了本网络方面的书。自己在查查。就此结贴。
另外提一下,在Ubuntu下,这论坛回帖的时候就会产生乱码,正常访问就不会。

我来回复

您尚未登录,请登录后再回复。点此登录或注册