contentprovider实现跨进程通信_基于TCP实现服务器端,多客户端通信(多线程,多进程并发编程)...

多客户端并发访问的问题分析

在程序编写前,我们先来分析一下为什么之前的程序只能运行在单客户机模式下,

我们来看一下之前的代码框架:

while (1){accept(); // 接收连接while (1){/* 读写处理 */···recv();send();}close(); // 关闭连接}

通过上述框架,我们很容易得出下述结论:

  • 当第一个客户端通过 accept()函数获得了连接套接字后便进入读写处理模块
  • 当第一个客户端的连接还未关闭时,第二个客户端到达,本希望通过accept函数得到连接套接字
  • 但是此刻服务器的主线程正在执行与第一个客户端进行读写处理,不能去处理第二个客户端的连接请求(accept函数),因此第二个客户端阻塞。
  • 直到第一个客户端关闭套接字后,主线程退出读写处理模块,继续循环读取新连接,这时第二个客户端的连接请求才从监听队列中拿出
  • 然后第二个客户端获得连接套接字,进行读写处理···

具体过程演示如下:

efbf5462686d47dd9e7bda76b8b7253f
7d3bb4118b534837ac140745d5617097

想要提高技术,或者进交流群学习的小伙伴

小编这有一些相关的学习资料和技术交流群聊,需要的可以。

私信我:学习

多线程方式实现客户端并发访问

通过上述分析,我们发现了问题所在,即如何能使服务器不断的处理连接请求(即执行accept函数)

那么我们可以使用多线程来并发处理,即每收到一个连接请求,就创建一个新线程来处理它,我们把之前的读写处理模块放入线程执行函数中,即可实现多客户端的并发访问:

// TCP客户端 服务器端通信(多客户机) :多线程实现#include #include #include #include #include #include #include #include /* 线程函数,新连接的读写处理 */void* thread_fun(void* arg){int connfd = *(int*)arg;while (1){char buffer[128] = { 0 };int n = recv(connfd, buffer, 127, 0);if (n <= 0) /* recv返回0表示通信对方已经关闭连接 */{break;}printf("buffer(%d) = %s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值