目录
一、TCP编程流程
二、函数接口
2.1、监听接口
2.2、发起连接 connect
2.3、接收新连接 accept
2.4、收发接口
三、代码实现
问题: 要是创建多个客户端的话会怎么样呢?
那么怎么去真正解决这个问题呢?
一、TCP编程流程
这里面需要注意的是: 三次握手成功之后,相当于客户端和服务端建立了tcp连接
还有重点重点重点:三次握手的过程是在内核当中完成的!!!,也就是说,三次握手的过程程序猿并没有写任何代码进行干预
二、函数接口
2.1、监听接口
int listen(int sockfd , int backlog );
2.2、发起连接 connect
int connect (int sockfd, const struct sockaddr *addr, socklen_t addrlen );
2.3、接收新连接 accept
程序从已完成连接队列当中将完成三次握手的连接接收回来
接收成功的标志:服务端为该连接创建了套接字描述符
int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen);
connect和accept之间的关系
返回的新连接的套接字,是为了和客户端进行通信的,只不过这个套接字没有进行监听功能,同时有客户端的地址信息。
多个客户端发起连接,在服务端会创建多个新连接的套接字
eg: 服务端使用socket创建的套接字描述符, 相当于是 “拉皮条的“ 侦听套接字,就在侦听是否有新连接到来
服务端使用accept创建出来的新连接套接字,相当于 “接客”的小红,新连接套接字,就是在同客户端通信的
2.4、收发接口
ssize_t send(int sockfd, const void *buf, size_t len , int flags );
ssize_t recv ( int sockfd , void *buf , size_t len , int flags );
三、代码实现
我们先来写服务端
我们这里先写到了listen,
1、这里我们可以通过telnet测试tcp是否监听成功,因为telnet可以向服务端发送连接请求,即三次握手
当出现什么都没有的时候就说明连接建立了
然后我们再次使用netstat 去观察一下端口的状态,会发现多了一行的信息
2、测试tcp,listen函数backlog,并发连接数的含义
并发连接数不等于tcp最大连接数
我们再来写客户端
写完之后我们来运行一下看看
发现能够正常的进行通信了
问题: 要是创建多个客户端的话会怎么样呢?
分析出现这种情况的原因:
首先,第二个客户端的代码能够执行到提示输入语句处,说明此时该客户端与服务端已经建立了连接。并且客户端发送数据后没有报错,说明客户端数据发送是成功的。因此问题肯定是出在服务端的代码。
我们可以通过netstat 命令来查看当前网络连接状态以及相关信息
证明我们的服务端代码是没有进行accept接收第二个客户端的,那么怎样去解决呢?
我们来分析一下现在的代码:
那么我们在循环当中加上accept能解决吗?
答案是不能
那么怎么去真正解决这个问题呢?
1、用多线程去解决
实现原理:
多线程代码:
2、用多进程解决
多进程代码: