socket 2---TCP编程

目录

一、TCP编程流程

二、函数接口

2.1、监听接口

 2.2、发起连接  connect

 2.3、接收新连接    accept

2.4、收发接口

三、代码实现

 问题:     要是创建多个客户端的话会怎么样呢?

扫描二维码关注公众号,回复: 14921752 查看本文章

那么怎么去真正解决这个问题呢?


一、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、用多进程解决

多进程代码:

猜你喜欢

转载自blog.csdn.net/flyingcloud6/article/details/128689586