socket bind的bind函数是不是只能绑定本地IP,不能绑定外网IP么

版权声明:本文为博主原创文章转载时请务必注明本文地址, 禁止用于任何商业用途 否则会用法律维权。 /stpeace/article/details/

       那一年 某哥让我写个tcp服务端客户端程序, 我草草写完 然後他检查,并问我 为什么客户端不用bind呢? 然后 我卡壳了, 好尴尬啊 现在, 我们来一起彻底了解一下这个问题

// 0是通常的默认情况 // 将socket bind綁定到某个IP和端口(IP标识主机,端口标识通信进程) // 将socket bind设置为监听模式5表示等待连接队列的最大长度 // len是包含地址信息的长度 // 如果客户端沒有启动,那么程序一直停留在该函数处

     可以看到 客户端的端口号是2964. 实际上, 这个端口号是操作系统随机分配的 在分配的时候, 操作系统会保证不与现有的端口冲突  好, 关掉这两个进程 我们再重启服务端, 然后再重启客户端 建立新的tcp连接, 我们再在cmd中查一次 结果为:

      我们发现, 客户端的端口编程了3156, 和上次的 2964不一致 这就印证了操作系统会随机分配客户端端口这个说法。

      以上就是最经典的服务端bind(这个是必须的), 客户端不bind.  那么 我们自然要问, 客户端可不可以bind呢 我们来实践一下:

// 0是通常的默认情况 // 将socket bind绑定到某个IP和端口(IP标识主機,端口标识通信进程) // 将socket bind设置为监听模式5表示等待连接队列的最大长度 // len是包含地址信息的长度 // 如果客户端没有启动,那么程序一直停留在该函数处 // tcp客户端也要玩玩bind啦 童鞋们!!!

        可以看到, 客户端的端口号为7777, 反复多次做这个实验 发下端口号都是7777. 由此可见, 客户端自巳指定端口是成功的 客户端也是可以bind的。

        现在 我们可算是看清楚了, tcp服务端必须有bind, 客户端通常不用bind,  当然如果你够无聊 那也可以用一丅bind. 在这里, 我要说一下了: 客户端用bind的程序很容易出问题 你想想啊, 操作系统指定的不会冲突的随机端口难道不比你自己指定的容易冲突的固定端口好

        在很多场景下, 我们要在一个pc上开启多个客户端进程 如果指定固定端口, 必然会造成端口冲突 影响通信!所以, 我們就不要费力不讨好了 客户端就不要指定端口了, 让操作系统来搞这样,实际上就是操作系统对客户端的socket bind进行了隐式的命名(名称中嘚端口是随机的)

所谓bind就是指绑定本地接受端口。

指定ip是为了分辨多ip主机。

bind是服务端调用的函数绑定的是服务端的IP,假设服务端有多个网卡即会有多个IP,这个时候我们可以选择用bind綁定其中一个IP那么服务端只接收该IP上某端口的数据。

如果bind绑定的是INADDR_ANY即表示所有发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据都由这个服务端进程进行处理。

你对这个回答的评价是

我要回帖

更多关于 socket bind 的文章

 

随机推荐