◎◎◎◎◎◎ 我认为是个很难说清楚的问题

bigsail 2007-05-09 03:36:27
TCP服务器创建一个子进程/线程来处理客户机的请求,同时会创建一个新的套接字描述符,
以后具体的通信都使用新的套接字,

我想知道如何获得服务器使用新的套接字与客户机通信的时候,
其与客户机通信的端口号还是不是监听端口号??????????
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这是因为我使用很多网络工具: netstat, 防火墙, sniffer等来跟踪都显示是服务器为每一个客户都使用的是相同的端口——监听端口。


但是,
1.在服务器这边对每一个新分配的SOCKET(accept返回的),使用 getsockname() 却总是得到相同的端口号,而且不论又多少客户机都是如此,而且该端口号不是监听端口号。

2.在客户机这边对套接字调用 *getpeername()* 应该得到服务器上的 *与客户机连接的端口号* ,但是得到的同样不是服务器上的监听端口号,但是得到的这个端口号却与 "1." 得到的端口号相同。


各位能否解释下:
到底服务器上与客户机连接的端口是怎么回事?是共用监听端口,还是随机分配新端口?
...全文
193 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wpy020327 2007-05-31
  • 打赏
  • 举报
回复
端口是同一个,但socket却不是同一个。
serversocket自己维持着一个socket数组,里面放的就是对不同客户端连接的socket。
最好自己建一个这样的表来管理,便于进行多线程开发
radiumhuang 2007-05-31
  • 打赏
  • 举报
回复
其实很简单的,这就是端口和连接的概念。socket表示连接。一个连接(已经连接上的)包含两个端口:本地端口和远程端口。事实上在socket内部还要加上各自的地址来区别。因此一个以连接的socket包含通信两端的地址和端口信息,getsockname得到的是本地的,getpeername得到的远程的。

每个客户端向服务器发出连接请求的时候,默认情况下本地端口是一个最小的可用端口,因此多个客户机看来就是随机的。而远程端口则是服务器的端口,因此都是一样的。

所以在服务器上调用getsockname得到的都是一样的结果,而且和在客户端上getpeername的结果一样。
另外,accept后getsockname得到的端口号就是服务器监听的端口号,估计你可能看错了。
bugebear3 2007-05-09
  • 打赏
  • 举报
回复
如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。

accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧