无连接的socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。
使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。
Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。
需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,
因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。 有连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息,
无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,
socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候打开端口。(
当然也有特殊情况,linux系统中rlogin命令应当调用bind函数绑定一个未用的保留端口号,还有当客户端需要用指定的网络设备接口和端口号进行通信等等)
总之:
.需要在建连前就知道端口的话,需要 bind
.需要通过指定的端口来通讯的话,需要 bind TCP协议中,客户端是不用绑定端口了,绑定之后只能运行一个client的程序属于自己人为设定的,
而从服务器那边得到的客户机连接端口号(是系统自动分配的)与这边客户机绑定的端口号根本是不相关的,所以客户端绑定也就失去了意义。 首先,服务器和客户端都可以bind,bind并不是服务器的专利。 客户端进程bind端口(设置sin_port): 由进程选择一个端口去连服务器,
(如果默认情况下,调用bind函数时,内核指定的端口是同一个,那么调用多个调用了bind()的client程序,会出现端口被占用的错误)
注意这里的端口是客户端的端口。如果不分配就表示交给内核去选择一个可用端口。 客户端进程bind IP地址(设置sin_addr.s_addr ):相当于为发送出去的IP数据报分配了源IP地址,
但交给进程分配IP地址的时候(就是这样写明了bind IP地址的时候)这个IP地址必须是主机的一个网卡地址,
不能分配一个不存在的IP。如果不分配就表示由内核根据所用的输出接口来选择源IP地址。 一般情况下客户端是不用调用bind函数的,一切都交给内核搞定。 服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),
它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。
服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接, 一般一个服务器程序里都有
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是针对IP4,IP6代码不太一样
表示不指定客户端IP,可以接受任意客户端链接
这里需要注意,如果servaddr.sin_addr.s_addr的值设置为127.0.0.1,表示只能接受本机的tcp链接,
如果servaddr.sin_addr.s_addr的值设置为192.168.xx.xx,表示只能接受来自网络的tcp链接,本机的链接无法接受
所以最好设置为htonl(INADDR_ANY)

Linux 客户端bind函数的使用的更多相关文章

  1. 网络编程api bind函数细节 select 细节

    struct sockaddr_in bindaddr; bindaddr.sin_family = AF_INET; bindaddr.sin_addr.s_addr = htonl(INADDR_ ...

  2. (十一)socket、connect、bind函数详解

    一.socket函数 1.头文件: #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> 2.函数原型: ...

  3. socket编程中客户端常用函数 以及简单实现

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  4. socket编程中客户端常用函数

    1 常用函数 1.1   connect() int connect(int sockfd, const struct sockaddr *servaddr, socklen_taddrlen); 客 ...

  5. c/c++ 网络编程 bind函数

    网络编程 bind函数 bind的作用是确定端口号. 正常处理都是先bind,然后listen 如果不bind,直接listen,会是什么结果? 内核会自动随机分配一个端口号 例子: #include ...

  6. Linux常用系统函数

    Linux常用系统函数 一.进程控制 fork 创建一个新进程clone 按指定条件创建子进程execve 运行可执行文件exit 中止进程_exit 立即中止当前进程getdtablesize 进程 ...

  7. 网络通讯中 bind函数的作用

    面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...

  8. bind函数的作用

    面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...

  9. linux select函数:Linux下select函数的使用详解【转】

    本文转载自;http://www.bkjia.com/article/28216.html Linux下select函数的使用 Linux下select函数的使用 一.Select 函数详细介绍 Se ...

随机推荐

  1. 安装/移除 MySQL 服务

    MySQL Community Server 下载:https://dev.mysql.com/downloads/mysql/ 以下内容使用的版本为:mysql-5.7.17-win32.zip 1 ...

  2. POJ 1636 Prison rearrangement DFS+0/1背包

    题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS   Memor ...

  3. C#中自定义属性的例子

    自定义属性的作用 有时候我们需要给一个类或者类中的成员加上一些属性或者附加信息,让类或者变量的功能更明确可控制的细粒度更高,打个简单的比方:数据库里面的一张表,表中的每一个字段都有很多属性,如是否主键 ...

  4. C++哪些运算符重载能够重载?

    运算符重载是C++极为重要的语言特性之中的一个.本文将用代码实例回答--C++哪些运算符能够重载?怎样重载?实现运算符重载时须要注意哪些? 哪些运算符能够重载,哪些不可重载? C++98,C++0x, ...

  5. angular学习笔记(三十)-指令(4)-transclude

    本篇主要介绍指令的transclude属性: transclude的值有三个: 1.transclude:false(默认值) 不启用transclude功能. 2.transclude:true 启 ...

  6. ossec变更alert等级及配置邮件预警

    一.场景 当攻击者尝试使用字典对某一台主机的sshd服务进行暴力破解的时候,如果我们能第一时间受到攻击预警的邮件的话,对安全人员或者运维人员来说都能做出快速响应.而使用ossec恰巧可以完成这一工作, ...

  7. linux系统查毒软件ClamAV

    安装方法: 长久使用参考: http://www.cnblogs.com/kerrycode/archive/2015/08/24/4754820.html#undefined 临时使用参考: htt ...

  8. 超级账本 --- ReadWriteSet的逻辑结构

    用于时序校验,解决双花问题 (doublespending)• Endorser– 模拟执行交易,生成ReadSet和WriteSet– ReadSet是交易前key值的状态– WriteSet是交易 ...

  9. linux命令(41):文件和文件夹的颜色

    各个颜色的文件分别代表的是:蓝色表示目录:绿色表示可执行文件:红色表示压缩文件:浅蓝色表示链接文件:灰色表示其它文件:红色闪烁表示链接的文件有问题了:黄色是设备文件,包括block, char, fi ...

  10. Using curl to upload POST data with files

    https://stackoverflow.com/questions/12667797/using-curl-to-upload-post-data-with-files ************* ...