Crazy knowledge base

套接字(Socket)【绑定、监听和连接连接】

【绑定-bind()函数】在实际应用中,我们可以通过对套接字和端口的绑定,来固定通信的连接,这样一来,在通信建立连接时就不需要花费时间去寻找端口号,也便于日后的维护。

创建套接字我们用到了socket函数,连接套接字我们用到了connect函数,而绑定套接字我们依然用一个函数完成:bind,它的函数原型是:

#include 
#include 
 
     int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

其中my_addr参数指定了sockfd绑定在本机的地址,如果将my_addr中的sin_addr设置为INADDR_ANY,那么就可以绑定任何网络接口了,一般来说对于对于只有一个IP地址主机,INADDR_ANY对应的就是该主机的IP地址。

bing函数的实例:

     struct sockaddr_in     serv_addr;
     memset(&serv_addr, sizeof(struct sockaddr_in));
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_port = htons(80);
     serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 
     if(bind(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr_in)) < 0){
          perror("Bind Error!\n");
          exit(-1);
     }

【监听-listen()函数】在服务器端的某个应用程序需要一种状态去等候客户端的通信邀请,这种状态称之为“监听”,监听本身不具备连接的功能,它仅仅是一种等候。监听的函数叫“listen()”,它的原型如下:

#include 
     int listen(int s, int backlog);

在服务器端的一个应用程序,首先会用socket创建一个应用程序的套接字,然后再使用bind将套接字和端口进行绑定,然后再开启listen去监听客户端的连接请求,在原型中s参数表示绑定后的文件描述符,而backlog参数代表接受监听队列的数量,如果backlog = 5,那么就表示这个套接字监听最大支持5个客户端的连接邀请,那么如果有6个客户端发出邀请呢?根据队列顺序,将最后一个就会舍弃。

listen函数实例:

#define LISTEN_NUM     5     /*定义一个连接请求队列的最大长度*/
 
     if(listen(sock_fd, LISTEN_NUM) < 0){
          perror("Listen Error!\n");
          exit(-1);
     }

跟以往一样,listen函数成功返回0,失败则返回-1并将错误代码写入errno中。

【接受-accept()函数】有了套接字、并且绑定了它,后来又建立的监听,那么当客户端邀请过来后,就是接受了,接受连接时,我们依然拥有一个特定的函数,那就是accept(),看看原型吧:

#include 
#include 
     int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

要说明一下的是不是所有套接字都可以使用accept函数进行通信接受的,只能是面向连接的套接字,也就是基于TCP协议的套接字,函数成功执行后,返回一个新创建的客户端套接字描述符(错-1,写进errno),服务器端利用这个新的套接字与客户端进行数据通信。如果参数s指定的服务器端套接字被设置为阻塞方式,而且连接请求队列为空(没有客户端连接请求),那么accept函数将被阻塞直道有客户端连接请求为止。如果参数s指定套接字为非阻塞,若请求队列为空,那么accept将立刻返回-1,errno也将被设置EAGAIN。

accept实例:

     int client_fd;
     int client_len;
     struct sockaddr_in client_addr;
...
     client_len = sizeof(struct sockaddr_in);
     client_fd = accept(sock_fd, (struct sockaddr *)&client_addr, &client_len);
     if(conn_fd < 0){
          perror("accpet error!\n");
          exit(-1);
     }

套接字(Socket)是一个针对TCP/IP协议的应用程序编程接口,既然是接口,那么其中就包括了基于TCP/IP协议的种种数据结构,里面包括了套接字的地址、创建、建立连接、绑定、监听、接受连接等几个部分,总的来说套接字是一种接口的编程方案,并不是唯一的,但是却是最常用的。

套接字(Socket)【绑定、监听和连接连接】
滚动到顶部