面向连接的协议 [2 ]

 

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

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

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

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

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

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

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

int listen(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 函数

int accept(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 接口时(如网关),这极为重要。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值