博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket编程之bind()函数
阅读量:2437 次
发布时间:2019-05-10

本文共 2252 字,大约阅读时间需要 7 分钟。

名称

bind()

把名字和套接字相关联

使用格式

#include <sys/types.h>

#include <sys/socket.h>

int
 bind(
int
 
sockfd
const struct sockaddr
 *
addr
,
socklen_t
 *
addrlen
);

功能描述

当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfdaddrlen指定了以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结构定义为如下格式:

[plain]   
 
  1. struct sockaddr {  
  2.     sa_family_t     sa_family;  
  3.     char            sa_data[14];  
  4. }  

该结构的唯一目的是强制结构指针在addr参数中传送,以避免编译过程出现warning。参看如下实例。

返回值

成功,返回0;出错,返回-1,相应地设定全局变量errno。

错误

EACCESS

地址空间受保护,用户不具有超级用户的权限。

EADDRINUSE

给定的地址正被使用。

实例:

下面的实例演示了如何在UNIX域中绑定流套接字,并接收连接。

[plain]   
 
  1. <span style="color:#3366ff;">#include <sys/socket.h>  
  2. #include <sys/un.h>  
  3. #include <stdlib.h>  
  4. #include <stdio.h>  
  5. #include <string.h>  
  6.   
  7. #define MY_SOCK_PATH "/somepath"  
  8. #define LISTEN_BACKLOG 50  
  9.   
  10. #define handle_error(msg) \  
  11.     do { perror(msg); exit(EXIT_FAILURE); } while (0)  
  12.   
  13. int  
  14. main(int argc, char *argv[])  
  15. {  
  16.     int sfd, cfd;  
  17.     struct sockaddr_un my_addr, peer_addr;  
  18.     socklen_t peer_addr_size;  
  19.   
  20.    sfd = socket(AF_UNIX, SOCK_STREAM, 0);  
  21.     if (sfd == -1)  
  22.         handle_error("socket");  
  23.   
  24.    memset(&my_addr, 0, sizeof(struct sockaddr_un));  
  25.                         /* Clear structure */  
  26.     my_addr.sun_family = AF_UNIX;  
  27.     strncpy(my_addr.sun_path, MY_SOCK_PATH,  
  28.             sizeof(my_addr.sun_path) - 1);  
  29.   
  30.    if (bind(sfd, (struct sockaddr *) &my_addr,  
  31.             sizeof(struct sockaddr_un)) == -1)  
  32.         handle_error("bind");  
  33.   
  34.    if (listen(sfd, LISTEN_BACKLOG) == -1)  
  35.         handle_error("listen");  
  36.   
  37.    /* Now we can accept incoming connections one  
  38.        at a time using accept(2) */  
  39.   
  40.    peer_addr_size = sizeof(struct sockaddr_un);  
  41.     cfd = accept(sfd, (struct sockaddr *) &peer_addr,  
  42.                  &peer_addr_size);  
  43.     if (cfd == -1)  
  44.         handle_error("accept");  
  45.   
  46.    /* Code to deal with incoming connection(s)... */  
  47.   
  48.    /* When no longer required, the socket pathname, MY_SOCK_PATH  
  49.        should be deleted using unlink(2) or remove(3) */  
  50. }</span>  

原文地址:

转载地址:http://nhrmb.baihongyu.com/

你可能感兴趣的文章
用Jbuilder8做一个简单的struts示例 (转)
查看>>
NeHe的opengl教程delphi版(3)----着色 (转)
查看>>
ORACLE SQL性能优化系列 (二) (转)
查看>>
控件treeview的使用 (转)
查看>>
TListView组件使用方法 (转)
查看>>
GDI+ 一个初级的使用GDI+开发的颜色拾取器用户控件 (转)
查看>>
运用VC或Java对Office进行编程操作 (转)
查看>>
Linux Shell 裡一些很少用到卻很有用的指令 (转)
查看>>
一套日本软件开发的详细设计说明书格式(一) (转)
查看>>
旅店管理系统中clerk的详细描述 (转)
查看>>
对MFC封装Windows通讯API的研究 (转)
查看>>
VC++中用内存映射文件 (转)
查看>>
Windows的保护模式 (转)
查看>>
双语或多语成品软件的编制 (转)
查看>>
pronote的说明 (转)
查看>>
成功软件开发者的9种编程习惯 2 (转)
查看>>
Learn c++ step by step (转)
查看>>
李维看 .net 和 DELPHI 6 (含李维照片) (转)
查看>>
ATL问题集-#13 ~ #14 (转)
查看>>
CMM概观 (转)
查看>>