客户端的socket是否需要bind?
2017-06-06 13:56
99 查看
bind() 函数的定义与作用——
将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
服务端——
服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。
服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接;
但是经常看见一些server端的代码是这么写的(没有明确写明bind 的IP):
?
之后执行bind函数
?
这种设定是因为该server可能有多个网卡(多个IP),但不确定client会从哪个网卡连接进来。这么设置可以使bind IP这个过程推迟,直到client端与server建立连接后,server才确定bind 哪个IP.
客户端——
?
TCP socket客户端通过调用Connect函数来连接server端,Connect()函数的第二个参数就是server端的地址信息,因为这种情况下只需知道server端 的地址,而客户通过哪个端口与服务器建立连接并不重要,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候打开端口,因此无须调用bind()。(当然也有特殊情况,linux系统中rlogin命令应当调用bind函数绑定一个未用的保留端口号,还有当客户端需要用指定的网络设备接口和端口号进行通信等等)
?
UDP socket客户端调用sendto()函数同样也只需要填写server端的地址信息(倒数第二个参数),系统依然是自动分配了端口给该socket。
客户端bind了地址可能带来的问题:
如果在client端的程序里,bind()了某个端口(比如 3456)。首先,得考虑这个端口是否被其他的程序占用了(增加了实现的难度和麻烦)。第二,如果client端是hard code了bind这么一个端口(3456),那么在这台电脑上,就只能运行一个客户端,因为同一个端口只能给一个socket使用。
总结:
bind地址的意义在于,可以提前确定端口号——比如:用于浏览网页服务的80端口,用于FTP服务的21端口等。server有这个需求,但是client基本没这个需求。
其他:
使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。
Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。
需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。
将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
服务端——
服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。
服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接;
但是经常看见一些server端的代码是这么写的(没有明确写明bind 的IP):
?
?
客户端——
?
?
客户端bind了地址可能带来的问题:
如果在client端的程序里,bind()了某个端口(比如 3456)。首先,得考虑这个端口是否被其他的程序占用了(增加了实现的难度和麻烦)。第二,如果client端是hard code了bind这么一个端口(3456),那么在这台电脑上,就只能运行一个客户端,因为同一个端口只能给一个socket使用。
总结:
bind地址的意义在于,可以提前确定端口号——比如:用于浏览网页服务的80端口,用于FTP服务的21端口等。server有这个需求,但是client基本没这个需求。
其他:
使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。
Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。
需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。
相关文章推荐
- 客户端的socket是否需要bind?
- socket 客户端在什么情况下需要bind
- 转载:在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
- 在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- VBScript判断客户端是否需要下载控件
- 如何解决同一URL 地址,服务器图片更变了,客户端怎么判断是否需要更变
- 网络编程(22)—— socket客户端和服务端收发数据包需要一对一的关系吗?
- socket怎么判断客户端与服务器是否断开
- 请教:多线程同时写socket是否需要加锁
- 移动客户端是否需要自动化测试
- C#服务端判断客户端socket是否已断开的方法
- 多线程访问socket, 是否需要加锁?
- socket的客户端判断连接是否正常
- C#服务端判断客户端socket是否已断开的方法
- 在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
- 为什么TCP服务端需要调用bind函数而客户端通常不需要呢?
- FTP客户端:上传需要关闭Socket
- 主题:在Android上实现SSL握手(客户端需要密钥和证书),实现服务器和客户端之间Socket交互
- socket bind在客户端和服务器端使用的区别