Socket初级问题?

vichal 2011-11-04 11:12:04
最近学习了一下Socket编程,有些疑惑希望高手帮忙解决一下。
我理解的Socket通信的基本步骤是这样的。
1. server 调用bind绑定一个端口然后listen监听端口然后用accept(阻塞或非阻塞)等待client连接
2. client 调用connect连接server
3. server 调用appcept获取到真实用来传输数据的新的Socket
4. client与server调用send/recv通信

我的问题是server在bind的时候我可以指定端口等待client的连接,那么accept的时候获取到了另外一个socket这个的端口是怎么生成的能详细说明下吗?为什么server和client的recv/send用的时候不同的socket.
...全文
89 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2011-11-04
  • 打赏
  • 举报
回复
客户端一个SOCKET就可以了,收发数据都是它。
服务器端有两个SOCKET,一个叫监听SOCKET,主要是用来监听client的connect,accept返回的就是另一个通讯的SOCKET,用来和client收发数据,和客户端的等同。
vichal 2011-11-04
  • 打赏
  • 举报
回复
那么client端调用send用的socket是connect初始化出来的对吧,是不是这个Socket的端口能读出来吗
请叫我涛哥0-0 2011-11-04
  • 打赏
  • 举报
回复
server端和client端通信的socket是相同的,listen的socket不同。
yynetsdk 2011-11-04
  • 打赏
  • 举报
回复
server绑定的端口,和 client连接 使用的端口,是2个不同的。client 连接 使用的port是系统内核分配的。
binarie 2011-11-04
  • 打赏
  • 举报
回复
socket和端口不是一一对应的。
accept返回的socket是由内核分配的,但仍然与监听的端口号相同。

“Server监听2012端口,客户connect2012端口得到socket句柄,那之后调用send发送数据是发送到服务器的哪个端口?recv是从哪个端口获取数据?”

send和recv的目标端口,端口号仍然是监听的端口号,但对应的服务器上的socket是accept返回的socket。

“server在accpet之后得到一个新的socket句柄,然后调用recv获取数据是,它在哪个端口上得到的数据。之后send用的又是哪个端口?”

新的句柄recv和send的目标是由accept接受的客户端。
出站端口号与监听端口号相同,目标端口号(客户机上的)是一个临时端口,由客户机建立连接时分配。
vichal 2011-11-04
  • 打赏
  • 举报
回复
那么端口在整个过程中扮演一个什么角色?
比如:
Server监听2012端口,客户connect2012端口得到socket句柄,那之后调用send发送数据是发送到服务器的哪个端口?recv是从哪个端口获取数据?
server在accpet之后得到一个新的socket句柄,然后调用recv获取数据是,它在哪个端口上得到的数据。之后send用的又是哪个端口?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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