手机制作ppt,百度搜索引擎优化,搭建合作平台,网站建设哪些公司bind
摘要 :在套接口中#xff0c;一个套接字只是用户程序与内核交互信息的枢纽#xff0c;它自身没有太多的信息#xff0c;也没有网络协议地址和 端口号等信息#xff0c;在进行网络通信的时候#xff0c;必须把一个套接字与一个地址相关联#xff0c;这个过程就是地址…bind
摘要 :在套接口中一个套接字只是用户程序与内核交互信息的枢纽它自身没有太多的信息也没有网络协议地址和 端口号等信息在进行网络通信的时候必须把一个套接字与一个地址相关联这个过程就是地址绑定的过程。许多时候内核会我们自动绑定一个地址然而有时用 户可能需要自己来完成这个绑定的过程以满足实际应用的需要最典型的情况是一个服务器进程需要绑定一个众所周知的地址或端口以等待客户来连接。这个事由 bind的函数完成。
从bind函数功能我们很容易推测出这个函数的需要的参数与相应的返回值如果此时大家已经对socket接口有点熟悉了
#includesys/socket.h
int bind ( int sockfd, struct sockaddr * addr, socklen_t addrlen )
返回 0 ──成功 - 1 ──失败
参数sockfd
指定地址与哪个套接字绑定这是一个由之前的socket函数调用返回的套接字。调用bind的函数之后该套接字与一个相应的地址关联发送到这个地址的数据可以通过这个套接字来读取与使用。
参数addr
指定地址。这是一个地址结构并且是一个已经经过填写的有效的地址结构。调用bind之后这个地址与参数sockfd指定的套接字关联从而实现上面所说的效果。
参数addrlen
正如大多数socket接口一样内核不关心地址结构当它复制或传递地址给驱动的时候它依据这个值来确定需要复制多少数据。这已经成为socket接口中最常见的参数之一了。
bind函数并不是总是需要调用的只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要那么程序可 以依赖内核的自动的选址机制来完成自动地址选择而不需要调用bind的函数同时也避免不必要的复杂度。在一般情况下对于服务器进程问题需要调用 bind函数对于客户进程则不需要调用bind函数。
bind函数
int bind(SOCKET s,const struct sockaddr FAR *name,int namelen
);
当创建了一个Socket以后套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和 一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符第二 个参数指定一个sockaddr结构该结构是这样定义的
struct sockaddr {u_short sa_family;char sa_data[14];
};
其中sin_family置AF_INETsin_port指明端口号sin_addr结构体中只有一个唯一的字段s_addr表示IP地 址该字段是一个整数一般用函数inet_addr把字符串形式的IP地址转换成unsigned long型的整数值后再置给s_addr。有的服务器是多宿主机至少有两个网卡那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时 可以把htonl(INADDR_ANY)置给s_addr这样做的好处是不论哪个网段上的客户程序都能与该服务程序通信如果只给运行在多宿主机上的 服务程序的Socket绑定一个固定的IP地址那么就只有与该IP地址处于同一个网段上的客户程序才能与该服务程序通信。我们用0来填充 sin_zero数组目的是让sockaddr_in结构的大小与sockaddr结构的大小一致。下面是一个bind函数调用的例子
struct sockaddr_in saddr
saddr.sin_family AF_INET;
saddr.sin_port htons(8888);
saddr.sin_addr.s_addr htonl(INADDR_ANY);
bind(ListenSocket,(struct sockaddr *)saddr,sizeof(saddr)) listen
摘要:listen函数使用主动连接套接口变为被连接套接口使得一个进程可以接受其它进程的请求从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器并指定相应的套接字变为被动连接。
listen函数在一般在调用bind之后-调用accept之前调用它的函数原型是
#includesys/socket.h
int listen ( int sockfd, int backlog )
返回 0──成功 - 1──失败
参数sockfd
被listen函数作用的套接字sockfd之前由socket函数返回。在被socket函数返回的套接字fd之时它是一个主动连接的套接字也就是此时系统假设用户会对这个套接字调用connect函数期待它主动与其它进程连接然后在服务器编程中用户希望这个套接字可以接受外来的连接请求也就是被动等待用户来连接。由于系统默认时认为一个套接字是主动连接的所以需要通过某种方式来告诉系统用户进程通过系统调用listen来完成这件事。
参数backlog
这个参数涉及到一些网络的细节。在进程正理一个一个连接请求的时候可能还存在其它的连接请求。因为TCP连接是一个过程所以可能存在一种半连接的状态有时由于同时尝试连接的用户过多使得服务器进程无法快速地完成连接请求。如果这个情况出现了服务器进程希望内核如何处理呢内核会在自己的进程空间里维护一个队列以跟踪这些完成的连接但服务器进程还没有接手处理或正在进行的连接这样的一个队列内核不可能让其任意大所以必须有一个大小的上限。这个backlog告诉内核使用这个数值作为上限。
毫无疑问服务器进程不能随便指定一个数值内核有一个许可的范围。这个范围是实现相关的。很难有某种统一一般这个值会小30以内。
当调用listen之后服务器进程就可以调用accept来接受一个外来的请求。关于accept更的信息请接着关注本系统文章。 下面是来自于http://blog.csdn.net/forrest_chen/article/details/7021409的一段话
TCP的服务器端socket基本流程socket-bind-listen-accept-send/recv-closesocket客户端基本流程socket-[bind-]-connect-send/recv-closesocket其中客户端connect函数应该是和服务器端的listen函数相互作用而不是accept函数。在listen函数中的第二个参数backlog代表着等待处理的连接队列以下简称队列的长度神马意思我也不太懂但是通过代码实践我可以简单的说每当有一个客户端connect了listen的队列中就加入一个连接每当服务器端accept了就从listen的队列中取出一个连接转成一个专门用来传输数据的socketaccept函数的返回值所以在服务器端程序中有两个socket前者是用来接收客户端连接的socket..
文章转载
https://blog.csdn.net/forrest_chen/article/details/7021409
https://blog.csdn.net/dongliqiang2006/article/details/5824651