bind函数解析
2016-04-11 22:40
561 查看
名称
bind()
把名字和套接字相关联
#include <sys/socket.h>
int bind(int sockfd, const
struct sockaddr *addr,socklen_t
addrlen);
通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名。
备注:
调用bind()函数之后,为socket()函数创建的套接字关联一个相应地址,发送到这个地址的数据可以通过该套接字读取与使用。
备注:
bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind()函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用bind()函数,对于客户进程则不需要调用bind()函数。
套接字的命名规则在不同的网络协议族中有所不同。对于AF_INET参看ip(),对于AF_INET6参看ipv6(),对于AF_INET6参看unix(),对于AF_APPLETALK参看ddp(),对于AF_APPLETALK参看packet(),对于AF_X25参看x25(),对于AF_NETLINK参看netlink()。
传送给参数addr的实际结构依赖于网络协议族。sockaddr结构定义为如下格式:
该结构的唯一目的是强制结构指针在addr参数中传送,以避免编译过程出现warning。参看如下实例。
地址空间受保护,用户不具有超级用户的权限。
EADDRINUSE
给定的地址正被使用。
bind()
把名字和套接字相关联
使用格式
#include <sys/types.h>#include <sys/socket.h>
int bind(int sockfd, const
struct sockaddr *addr,socklen_t
addrlen);
功能描述
当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfd。addrlen指定了以addr所指向的地址结构体的字节长度。一般来说,该操作称为“给套接字命名”。通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名。
备注:
调用bind()函数之后,为socket()函数创建的套接字关联一个相应地址,发送到这个地址的数据可以通过该套接字读取与使用。
备注:
bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind()函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用bind()函数,对于客户进程则不需要调用bind()函数。
套接字的命名规则在不同的网络协议族中有所不同。对于AF_INET参看ip(),对于AF_INET6参看ipv6(),对于AF_INET6参看unix(),对于AF_APPLETALK参看ddp(),对于AF_APPLETALK参看packet(),对于AF_X25参看x25(),对于AF_NETLINK参看netlink()。
传送给参数addr的实际结构依赖于网络协议族。sockaddr结构定义为如下格式:
struct sockaddr { sa_family_t sa_family; char sa_data[14]; }
该结构的唯一目的是强制结构指针在addr参数中传送,以避免编译过程出现warning。参看如下实例。
返回值
成功,返回0;出错,返回-1,相应地设定全局变量errno。错误
EACCESS地址空间受保护,用户不具有超级用户的权限。
EADDRINUSE
给定的地址正被使用。
实例:
下面的实例演示了如何在UNIX域中绑定流套接字,并接收连接。#include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MY_SOCK_PATH "/somepath" #define LISTEN_BACKLOG 50 #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { int sfd, cfd; struct sockaddr_un my_addr, peer_addr; socklen_t peer_addr_size; sfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sfd == -1) handle_error("socket"); memset(&my_addr, 0, sizeof(struct sockaddr_un)); /* Clear structure */ my_addr.sun_family = AF_UNIX; strncpy(my_addr.sun_path, MY_SOCK_PATH, sizeof(my_addr.sun_path) - 1); if (bind(sfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_un)) == -1) handle_error("bind"); if (listen(sfd, LISTEN_BACKLOG) == -1) handle_error("listen"); /* Now we can accept incoming connections one at a time using accept(2) */ peer_addr_size = sizeof(struct sockaddr_un); cfd = accept(sfd, (struct sockaddr *) &peer_addr, &peer_addr_size); if (cfd == -1) handle_error("accept"); /* Code to deal with incoming connection(s)... */ /* When no longer required, the socket pathname, MY_SOCK_PATH should be deleted using unlink(2) or remove(3) */ }
相关文章推荐
- hdu 1847 Good Luck in CET-4 Everybody!
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- 广东工业大学2016校赛决赛重现——E积木积水(方法据说很多)
- IOS学习 网络 User-Agent 换行/r/n最安全 url汉字转换
- mxGraph Web在线绘图
- JavaScript基础教程04Math对象介绍
- 创业者要处理好的10大关系
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- 网络安全——数据的加密与签名,RSA介绍
- Example017简单的下拉框
- iOS UITextView 根据输入text自适应高度
- JavaScript开发的技巧
- Android 多线程及线程通信
- c++中sort()及qsort()的用法总结
- hihocoder #1270 建造基地
- hihocoder 1149 : 回文字符序列(区间dp)
- C# DataGridView添加右键菜单等技巧
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
- 编译原理-用FLEX构造词法分析程序
- 如何在eclipse中更改jsp页面的charset以解决中文乱码问题