请教个tcp/ip的端口的问题

warsong 2009-03-21 12:06:10
我做了一个简单的基于TCP/IP的服务器-客户端程序,连接和通讯都成功了。但在使用getpeername和getsockname函数获取本机(服务器)IP端口和远程(客户端)IP端口时得到的结果如下:Sock: 192.168.1.26:5150和Peer: 192.168.1.19:1591。ip地址没什么问题,但为何两者的端口不一样(5150是我的服务器bind的端口)?这样能通讯吗?还有,书上说服务器的socket在accept一个客户端的请求以后会产生一个新的套接字来负责和客户端的通讯。这个新套接字和原套接字的端口一样吗?那么,当与多个客户端通讯时,服务端的所有新套接字都用同一个端口吗?那该如何区分数据呢?
...全文
161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
warsong 2009-04-01
  • 打赏
  • 举报
回复
这样啊,明白了,谢谢!
jadeluo 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 warsong 的回复:]
哦,如果服务端的多个通讯套接字的端口都一样(和监听套接字相同),那么怎么区分来自不同客户端的信息呢?
[/Quote]

服务端的Socket里有客户端的信息(IP地址,端口)的, 可以利用这个来区分。
warsong 2009-03-31
  • 打赏
  • 举报
回复
哦,如果服务端的多个通讯套接字的端口都一样(和监听套接字相同),那么怎么区分来自不同客户端的信息呢?
helodd 2009-03-31
  • 打赏
  • 举报
回复
是的,服务器还是会用那个端口, 但与新开的一个端口(线程)套在一起重叠了吧。。。。
warsong 2009-03-27
  • 打赏
  • 举报
回复
to jadeluo:客户端的情况我大概了解了,请问您能回答我关于服务端的问题吗?
xiaocongzhi 2009-03-26
  • 打赏
  • 举报
回复
进来学习一下
jadeluo 2009-03-26
  • 打赏
  • 举报
回复
客户端使用的端口是由客户端程序决定的,与服务器端无关。
一般客户端程序在连接服务器端时会指定本地的端口为0, 表示让操作系统分配一个未使用的本地端口用于此次连接,表现出来就是你所说的"随机分配",当然,本质上它并不是随机的。
如果同一客户端多次连接服务器端,且中间没有其他程序向操作系统申请过端口,则客户端被分配到的本地端口将是“一个连接一个端口”。
warsong 2009-03-26
  • 打赏
  • 举报
回复
看了两位的回答,我这样小结一下(对不对?):
如果服务器的监听端口是5150,那么客户端使用的实际端口是随机分配而不是5150,并且一个连接一个端口,彼此不同。而服务端accept一个客户连接就创建一个新套接字(原来那个套接字继续监听5150,可以称之为监听套接字)来负责和客户通讯(可以称之为通讯套接字),多个通讯套接字的端口都一样(都是5150)。问题是,既然是同一个端口,那么服务端怎么区分来自不同客户端的信息呢?
Channels_net 2009-03-24
  • 打赏
  • 举报
回复
我做了一个简单的基于TCP/IP的服务器-客户端程序,连接和通讯都成功了。但在使用getpeername和getsockname函数获取本机(服务器)IP端口和远程(客户端)IP端口时得到的结果如下:Sock: 192.168.1.26:5150和Peer: 192.168.1.19:1591。
---------------------------------------
本机端口是5150,当你用客户端的端口去连接服务器的端口5150的时候,服务器会分配一个服务器端口1591,去与你客户端的5150相连接

ip地址没什么问题,但为何两者的端口不一样(5150是我的服务器bind的端口)?
这样能通讯吗?
--------------------------------------------------
只要在服务器记录住于客户端的5150像对应的套接字(Socket),操作这个套接字就可以与客户端通讯了

还有,书上说服务器的socket在accept一个客户端的请求以后会产生一个新的套接字来负责和客户端的通讯。这个新套接字和原套接字的端口一样吗?
-------------------------------------------------
这个套接字是服务随机的一个端口形成,是不一样。

那么,当与多个客户端通讯时,服务端的所有新套接字都用同一个端口吗?那该如何区分数据呢?
--------------------------------------------------
记住这个套接字就可以了
warsong 2009-03-23
  • 打赏
  • 举报
回复
谢谢解答,我知道客户端的端口的情况了。但是关于服务端的端口的那些问题的答案又是什么呢?
ahhjgh 2009-03-21
  • 打赏
  • 举报
回复
端口不一样可以通讯的,只要客户端请求的端口是服务器监听的端口就行

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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