标签:
bind() 函数的定义与作用——
将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
当用socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号)。
服务端——
服务端进程bind端口:基本是必须要做的事情,比如一个服务器启动时(比如freebsd),它会一个一个的捆绑众所周知的端口来提供服务,同样,如果bind了一个端口就表示我这个服务器会在这个端口提供一些“特殊服务”。
服务端进程bind IP地址:目的是限制了服务端进程创建的socket只接受那些目的地为此IP地址的客户链接,一般一个服务器程序里都有
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 只是针对IP4,IP6代码不太一样
这样一句话,意思就是:我不指定客户端的IP,随便连,来者不拒!
客户端——
int connect ( SOCKET s,const struct sockaddr * name,int namelen );
int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
UDP socket客户端调用sendto()函数同样也只需要填写server端的地址信息(倒数第二个参数),系统依然是自动分配了端口给该socket。
客户端bind了地址可能带来的问题:
总结:
bind地址的意义在于,可以提前确定端口号——比如:用于浏览网页服务的80端口,用于FTP服务的21端口等。server有这个需求,但是client基本没这个需求。
其他:
使用bind函数时,通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。
Bind()函数在成功被调用时返回0;出现错误时返回"-1"并将errno置为相应的错误号。
需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择大于1024中的任何一个没有被占用的端口号。
参考:http://blog.chinaunix.net/uid-23193900-id-3199173.html
标签:
原文地址:http://my.oschina.net/Bruce370/blog/409157