免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5081 | 回复: 4
打印 上一主题 下一主题

[C++] socket通信中的bind [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-04 19:06 |只看该作者 |倒序浏览
最近在看socket通信,发现服务器端一般都用bind进行端口绑定,但是客户端就不用,不知道为什么?这里的服务器端的端口绑定是说把正在运行的服务程序和端口绑定在一起吗?那这个绑定什么时候解除?进程结束就解除了嘛?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-04 20:18 |只看该作者
本帖最后由 linux_c_py_php 于 2012-10-04 20:30 编辑

不绑定的话在第一次发包(包括connect)时, 会由内核帮你绑定一个port, 你可以getsockname来获取这个端口, 对TCP, UDP均适用.

1,什么时候解除 ?
关闭socket的时候.

2, 为什么服务端要绑定, 客户端不用?
因为服务端是被动方, 需要在一个众所周知的PORT上等待服务请求者, 否则作为客户端怎么知道去什么IP什么PORT请求服务呢?

3, 是不是客户端就不能bind?
作为客户端, 是可以主动bind的, 一方面可以bind 0, 由内核帮你选定一个PORT, 一方面可以bind你想用的PORT, 其实就是不需要内核帮你选择PORT而已.
了解FTP协议与TCP协议的实现原理的话, 你会知道TCP是4元组.  绝大多数FTP服务端在实现被动连接模式时(服务端此刻是一个客户端), 都是主动bind 21端口, 然后connect到客户端提供的IP: PORT上, 貌似服务端重复bind 21端口, 其实因为connect到的客户端的IP: PORT元组都是不同的(每个IP上的FTP客户端保证不会重复bind, 依赖EADDRINUSE错误基于给定port range的, 或者bind 0的), 所以不能对bind一概而论.

对于UDP, 又是另一回事, 在同一个机器上重复bind导致的是round-robin dispatch, 这一个用途也是有的.

论坛徽章:
0
3 [报告]
发表于 2012-10-04 21:38 |只看该作者
回复 2# linux_c_py_php


    谢谢你的回答,我好想明白一点了。
   那我是不是可以这样理解:如果是服务端bind,只需bind一次,然后就一直监听,如果有请求连接就响应,当对当前客户端响应完了就发送FIN信息,然后又回到监听状态,等待别的客户端请求。如果是客户端bind的话,就需要不断bind,在每一次请求connect服务端之前都要bind一次。不知道我这样理解对不对?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2012-10-05 09:37 |只看该作者
一个TCP连接是由4元组唯一确定的(remote ip, remote port, local ip, local port), 假设服务端使用(local ip, local port), 那么服务端bind在port = 8080后, listen进入监听状态.
之后, 有客户端(remote ip, remote port) connect (local ip, local port), 此后三路握手完成, 客户端与服务端建立了TCP连接, 就是(remote ip, remote port, local ip, local port), 服务端通过accept可以取出这个连接对应的socket, 其中local ip是客户端请求到来的网卡IP(因为服务端向此网卡送出发往remote的包一定也能路由回去), local port(8080, 和监听port一样), remote ip, remote port是该客户端的IP和一个PORT, 这就是一个完整的四元组, 确定了一个TCP连接, 这是一个新的SOCKET, 是accept来的. 与监听socket没有关系了, 监听socket仍然在监听, 只不过监听socket的local port和accepted socket的local port都是8080, 这是毫无问题的, 这就是事实, 因为监听socket只用于监听在给定PORT, 连接建立完成后是4元组, 虽然local port都是8080, 但remote ip, remote port这个2元组都是不同的(除非客户端犯贱重复bind后connect同一个server).

wy200747055 发表于 2012-10-04 21:38
回复 2# linux_c_py_php

论坛徽章:
0
5 [报告]
发表于 2012-10-05 12:11 |只看该作者
回复 4# linux_c_py_php


    太详细了,非常感谢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP