bind() 函数的定义与作用——

将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。

当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。

服务端——

服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。
  服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接;

但是经常看见一些server端的代码是这么写的(没有明确写明bind 的IP):

?

1

servaddr.sin_addr.s_addr
= htonl(INADDR_ANY);

之后执行bind函数

?

1

bind(Sockfd,
(
struct

sockaddr *)servaddr,
sizeof(struct

servaddr));

这种设定是因为该server可能有多个网卡(多个IP),但不确定client会从哪个网卡连接进来。这么设置可以使bind IP这个过程推迟,直到client端与server建立连接后,server才确定bind 哪个IP.

客户端——

?

1

int

connect ( SOCKET s,
const

struct

sockaddr * name,
int

namelen );

TCP socket客户端通过调用Connect函数来连接server端,Connect()函数的第二个参数就是server端的地址信息,因为这种情况下只需知道server端 的地址,而客户通过哪个端口与服务器建立连接并不重要,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候打开端口,因此无须调用bind()。(当然也有特殊情况,linux系统中rlogin命令应当调用bind函数绑定一个未用的保留端口号,还有当客户端需要用指定的网络设备接口和端口号进行通信等等)

?

1

int

sendto ( socket s ,
const

void

* msg,
int

len, unsigned
int

flags,
const

struct

sockaddr * to ,
int

tolen ) ;

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中的任何一个没有被占用的端口号。

客户端的socket是否需要bind?相关推荐

  1. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  2. 简单分析一下socket中的bind

    在最开始接触bind的时候,只是在写基于tcp的server端的时候,知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听.而bind的时候,函数参数中的端口填自己将要 ...

  3. socket 通信关于bind那点事

    结论: 1.采用TCP通信时,客户端不需要bind()他自己的IP和端口号,而服务器必须要bind()自己本机的IP和端口号; 2.若采用UDP通信时(这里是有客户端和服务器之分才这么说的,若是指定特 ...

  4. 好玩的python代码聊天客户端_python socket实现客户端与服务器端对话

    最近巩固下python语言,说真的,使用了这么多脚本语言,还是这门比较好玩点,快速,简洁,容易上手更不用说了. socket 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等) ...

  5. socket通信之bind函数

    socket通信之bind函数 bind函数的原型如下: #include <sys/types.h> /* See NOTES */ #include <sys/socket.h& ...

  6. Linux下Socket编程:bind().Address already in use的解决方法

    当客户端保持着与服务器端的连接,这时服务器端断开,再开启服务器时会出现: Address already in use,可以用netstat -anp | more 可以看到客户端还保持着与服务器的连 ...

  7. java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信

    Socket编程之简单客户端与服务器端通信 socket 通常用来实现客户端和服务端的连接,socket 是Tcp/Ip协议的一个十分流行的编程界面,一个socket 由一个Ip地址和一个端口号唯一确 ...

  8. 从Linux源码看Socket(TCP)的bind

    从Linux源码看Socket(TCP)的bind 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看下Server ...

  9. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

最新文章

  1. CPU值满resmgr:cpu quantum造成的Oracle等待事件解决办法
  2. 不怕面试被问了!二叉树算法大盘点
  3. excel文件修复工具_Windows商店上架文件恢复工具!仅8.29MB,纯净无捆绑,80%修复率...
  4. MSSQL字符串处理-清除指定不连续或连续的字符
  5. sqlplus登录方式,列出所有表,列出表结构,sqlplus行和列显示设置,别名,空值问题,连接符,DISTINCT
  6. linux定时调用程序参数说明
  7. shell与subshell与执行脚本的几种方式
  8. 函数的参数个数是不固定_EXCEL这些序号技巧,你还真不一定都知道
  9. 电脑怎么设计java环境_java环境变量配置,详细教您win7怎么配置java环境变量。
  10. C语言如何输出100以内的质数?(带注释)
  11. 虚拟机VMware 15安装教程
  12. 设置idea的ant工具的代理
  13. zblog导航小智收录网导航模板
  14. SAP 记账凭证 更改 冲销
  15. 牛逼哄哄的京东 JD-hotkey
  16. paddlepaddle本地环境配置
  17. python ljust()、center() 、rjust() 字符串填充左中右对齐
  18. ios android md5加密,iOS中使用MD5加密
  19. idea和eclipse哪个更好用?为什么呢?
  20. 叉乘点乘混合运算公式_初中数学根式运算法则公式

热门文章

  1. java版数据结构解迷宫问题_C语言数据结构之迷宫问题
  2. c语言简单密码字符a用f代替,c语言实验.doc
  3. erp系统服务器怎么关机,服务器怎么设置自动关机
  4. python定时关机_python 实现定时关机(windows,python3)
  5. 成为单片机高手必知的三个重要步骤(干货分享)
  6. vivado常规操作之烧写bit文件_固化mcs文件_调试界面debug之ila与vio的操作
  7. python教程list类型_Python数据类型之list相关常用操作
  8. c语言访问数据库 不用odbc,急问ODBC访问数据库问题
  9. 超线程cpu的寄存器_一文总结 CPU 基本知识
  10. 服务器引导顺序,docker compose 服务启动顺序控制的方法