SOCKET编程中的bind函数的作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SOCKET编程中的bind函数的作用相关的知识,希望对你有一定的参考价值。

书上写:bind方法将本机地址关联到套接字上,这句话到底是什么意思?为什么服务器上要关联,客户端上却不要关联。关联到低是哪两个东西之间建立联接呀,总感觉这个方法莫名其妙,但是程序里面却又总是出现,望指点。小问题,分数不多,二十分。
如果能有关于sokcet常 用API函数的详细介绍就最好了,可以复制网页,但最好用自己的话给偶讲下,大段的文字直接复制就不用了。

socket编程中的bind()函数把IP地址端口相关信息和套接字相互关联起来。

使用格式
#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()函数。
参考技术A bind就是绑定一个公共的服务地址,只有这样客户端才能找到你。打个比方,银行是不是有个为公众所知的地址,而客户却不需要那个地址,因为到时候是客户自己根据银行的地址找到银行的。要学习socket,详情请看参考资料所附带的网站,上面有最基本的入门知识

参考资料:http://www.xueyusi.com

本回答被提问者和网友采纳

socket bind函数

 1 #include<stdio.h>
 2 #include<sys/types.h>
 3 #include<sys/socket.h>
 4 #include<netinet/in.h>
 5 #include<arpa/inet.h>
 6 #include<unistd.h>
 7 #define PORT 2345
 8 #include<stdlib.h>
 9 #include<string.h>
10 int main(void)
11 {
12     int sockfd;
 1 /*
 2 注意两种套接口的 数据结构
 3 
 4 原始套接口
 5 #include<sys/socket.h>
 6 struct sockaddr
 7 {
 8       uint8_t sa_len;  //长度成员,无需设置
 9       sa_family_t sa_family;//协议族  AF_ xxx
10       char sa_data[14];//14bit的协议地址
11 }
12 
13 
14 
15 IPv4 套接口
16 
17 #include<netinet/in.h>
18 
19 struct socketaddr_in
20 {
21      uint8_t sin_len;    /*长度成员无需设置*/
22      sa_family_t sin_family;//套接口结构地址族,如IPv4 为AF_INET
23      in_port_t sin_port;//16位的TCP和UDP端口号
24      struct in_addr sin_addr;
25     unsigned char sin_zero[8];   //未用
26 }
27 
28 
29 
30 struct in_addr
31 {
32        in_addr_t s_addr;
33 }

13     struct sockaddr_in addr;
14     int addr_len=sizeof(struct sockaddr_in);
/*
socket 函数
作用:创建为系统调用的套接口socket

头文件及原型:
#include<sys/types.h>
#include<sys/socket.h>
int socket(int family,int type,int ptotocol);

返回值:  成功返回 套接口描述符  失败返回-1

family 指的是协议簇 取值如下:

PF_UNIX(UNIX协议族)   PF_INET(IPv4 协议)  PF_INET6(IPv6协议)
AF_FOUTE(路由套接口)  


type  指明了通信的字节流类型

SOCK_STREAM TCP方式   SOCK_DGRAM UDP方式   SOCK_RAW 原始套接字  SOCK_PACKET  支持数据链路访问

ptotocol  
可以设置为0.原始套接字另外
*/

15     if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
16     {
17         printf("socket created error!");
18         exit(1);    
19     }
20     else 
21     {
22         printf("socket created successfully!\nsocket id:%d\n",sockfd);
23     }
24
1 /*
2 用法:
3 函数原型  
4 extern void bzero(void *s, int n);
5 头文件
6 #include <string.h>
7 功能:置字节字符串s的前n个字节为零。
8 */
25     bzero(&addr,sizeof(struct sockaddr_in));//清空表示地址的结构体变量
26     addr.sin_family=AF_INET;
27     addr.sin_port=htons(PORT);//返回网络字节序
28     addr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。
29
 1 /*
 2 bind函数
 3 
 4 作用:使用bind函数在套接口上面绑定一个指定的端口号和ip地址
 5 
 6 头文件及函数原型
 7 
 8 #include<sys/types.h>
 9 #include<sys/socket.h>
10 int bind(int sockfd, const struct sockaddr *my_addr,socklen_t addrlen);
11 
12 
13 参数定义:
14 sockfd 已经建立的套接字的描述符
15 my_addr  指向sockaddr结构体类型的指针
16 addrlen 表示my_addr 结构的长度
17 
18 
19 */
30     if(bind(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))<0)//强制类型转换
31     {
32         perror("bind error!");
33         exit(1);
34     }
35     else
36     {
37         printf("bind port successfully!\nlocal port:%d\n",PORT);
38     }
39     return 0;
40 }

程序运行结果:

1 socket created successfully!
2 socket id:3
3 bind port successfully!
4 local port:2345

 

以上是关于SOCKET编程中的bind函数的作用的主要内容,如果未能解决你的问题,请参考以下文章

socket编程bind()函数

socket编程中为啥client端的可以不用bind函数绑定.而客户端必须呢?

Socket编程函数:socket,bind,listen,accept,connect,出错处理函数[奇牛学院]

windows socket 编程:bind 错误码-1 如何解决?

请问java socket 里面的bind做啥用?

为啥socket后,客户端可以不适用bind函数