有了地址的设置函数之后,接下来就是开始进行连接
服务端存在两个函数
1 |
|
accept
函数受理连接请求等待队列中待处理的客户端连接请求
客户端使用 connect发起连接请求
1 | /** |
客户端调用 connect
之后,可能发生以下情况之一才返回(完成函数调用)
-
服务端接收连接请求
-
发生断网导致一场情况而中断连接请求(阻塞的)
客户端connect
的时候并没有指定客户端的地址,那么是什么时候分配的ip 与端口?其实是自动分配的,所以客户端无需调用标记的 bind
函数进行分配
TIPS: 接收连接并不意味着服务端调用
accept
函数,而是服务端把连接请求信息记录到等待队列。因此connect
函数返回之后并不立即进行数据交换,那么问题来了,客户端既然不知道服务端是否已经accept
了,那么如果客户端立即write
发送数据,数据到服务端会是一个什么状态答:如果服务器端尚未调用
accept
,连接处于已建立但未接受的状态。在这种情况下,发送的数据将保留在等待队列中,等待服务器端调用accept
来接受连接。一旦服务器端调用了accept
,则可以开始在客户端和服务器端之间进行数据交换
所以函数的调用关系如下

这章要求是写一个回写 CS,代码:https://github.com/XBoom/network-ip.git 中的 apps/socket/06/
执行结果,服务端接收到消息之后恢复给客户端,有两种情况,每一次写入都原样写回;第二种是每次的写入收集起来一次写回
要求:
- 服务器端在同一时刻只能与一个客户端相连,并提供回声服务
- 服务器端一次向5个客户端提供服务并退出
- 客户端接收用户输入的字符串并发送到服务器端
- 服务器端将接收的字符串数据传回客户端,即“回声服务”
- 服务器端与客户端之间的字符串回声一致执行到客户端输入Q
1 | ./server 5555 |
读写操作 read/write
由于是无边界,数据存储在IO缓存区等待读写

IO缓存区有以下特点
- IO缓冲在每个TCP套接字中单独存在
- IO缓冲在创建套接字时自动生成
- 关闭套接字会继续传递输出缓冲中遗留的数据
- 关闭套接字会丢失输入缓冲中的数据
TIPS: 输出不丢失是因为系统自动进行发送操作,而输入丢失是因为套接字关闭了输入缓冲中的数据也没有人能够读到了,也就丢掉
参考文档
- 《TCPIP 网络编程》