面向连接的协议 [2 ]

来源:互联网 发布:php类魔术方法 编辑:程序博客网 时间:2024/05/17 04:10

 

面向连接的协议—服务器端

面向连接的服务器和客户端

由图我们可以看出,服务器与客户的区别在于:

  1. 服务器必须进行套接口绑定。因为如果服务器没有地址,客户就无法进行连接。

    S3的作用在于告诉内核,在某个套接口上监听并接收请求。

  2. 服务器需要监听连接。

下面,我们介绍一下有关的函数,

intlisten(int sockfd, int backlog);

s:用于监听的套接口。Backlog:监听队列(the queue of pending connections)的最大长度。

2.2之后的版本中,backlog的值只包括与监听套接口建立了的连接数。

成功:返回0,否则,返回-1,失败原因 在errno中。

  • 监听队列

监听队列

如上图,对listen函数调用成功后,在Linux内核中建立了一个监听队列,它的长度由

backlog决定。图中正在处理请求1,第2 到第5的连接请求被挂起,第6个请求正在插入队列,同时内核还收到了7,8,9号连接。更多的连接正在到达的路上。

 

accept函数

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

sockfd:socket()创建,已经用bind()绑定了一个本地地址,正在监听连接的套接口的描述符。

addr:用于存放通信的另一端(客户)的套接口地址的变量。

addrlen:既是输入参数又是输出参数。作为输入参数,它指定了addr的最大长度。作为输出参数,当函数返回后,它代表了地址的实际长度。

如果函数调用成功,它返回一个新的套接口描述符。否则,返回-1,错误的原因记录在errno

中。在新的套接口代表服务器端与客户端进行通信。当客户请求处理完毕时,这个由accept返回的套接口将关闭。而为了能够接收新的用户请求,在此期间,sockfd指定的,也就监听套接口,一直处于打开状态。

小节:这里提到了两种套接口,一种是监听套接口,数量只有一个,作用是接收用户请求并创建新的套机口(通信套接口)。另一种,accept返回的通信套接口,它同用户进程连接,并实现数据的读写操作。

下面是一个简单的TCP/IP服务器程序,用来代替daytime服务器。

成功。

扩展:

TCP/IP1~1024端口都被保留起来了,一般自己写的服务器程序使用>=1024的端口

0:表示通配端口,系统会自动的为它分配一个没有使用的端口。

INADDR_ANY:通配IP地址。

严格意义上讲,服务器的地址包括IP地址和端口号两部分。

一个服务器地址不能完全通配。服务器地址完全通配,当且仅当Ip地址和端口号都通配。

这样,在指定了特定端口号后,IP地址部分可以通配(INADDR_ANY),这使得服务器可以接受客户发往任何一个本地接口的连接请求。当一个主机有多个IP接口时(如网关),这极为重要。

 

原创粉丝点击