tcp网络编程——2

1.一个服务器只能有一个客户端连接(下面代码)

​​​​​​​tcp网络编程(基础)-CSDN博客

2.一个服务器可以有多个客户端连接(多线程)

server端创建多个线程,每个线程与不同的client端建立连接。

-----这里只需要改变下TcpServer.hpp就行了

#pragma once#include<iostream>
#include<pthread.h>
#include"Socket.hpp"class TcpServer;  //在ThreadData前声明,ThreadData才可以调用TcpServer,否则TcpServer未定义
class ThreadData
{
public:ThreadData(Socket* s, TcpServer* t, std::string& clientip, uint16_t port):sockp(s),tcp_this(t),_clientip(clientip),_port(port){}
public:Socket* sockp;TcpServer* tcp_this;std::string _clientip;uint16_t _port;
};class TcpServer
{
public:TcpServer(uint16_t port) :_port(port), _listensocket(new TcpSocket()){_listensocket->BuildListenSocketMethod(_port, defaultbackflag); //设置为监听状态}static void* Thread_Run(void* args) //根据pthread_create的要求,这个函数的参数只能是void*,并且只有一个,所以用static{pthread_detach(pthread_self()); //将线程设置为分离状态,主线程就不用阻塞等待(join)子线程ThreadData* td = static_cast<ThreadData*>(args);  char bufferin[1024];while(true){ssize_t n = recv(td->sockp->GetSockfd(), bufferin, sizeof(bufferin)-1, 0); //接收client发送的信息//ssize_t n = (s->GetSockfd(), bufferin, sizeof(bufferin)-1);if(n > 0){bufferin[n] = 0;std::string ret;ret += td->_clientip;ret += " ";ret += std::to_string(td->_port);std::cout << ret << " " << "client say#" << bufferin << std::endl;    }else{break;}}return nullptr;}void Loop(){//client的ip,portstd::string peerip;uint16_t peerport;while(true){Socket* s = _listensocket->AcceptConnection(&peerip, &peerport); //服务端接收客户端发来的连接请求if(s == nullptr) exit(0);std::cout << "accept success" << std::endl;//创建线程pthread_t id;ThreadData* td = new ThreadData(s, this, peerip, peerport); pthread_create(&id, nullptr, Thread_Run, td); //我们传结构体给Thread_Run函数//我们不能join去回收,我们采取将子线程分离(pthread_detach)方式//原因:join会阻塞等待,如果有新的客户端想连接(connect)服务端,而server在join阻塞,并没有accept,导致connect失败// ssize_t n = recv(s->GetSockfd(), bufferin, sizeof(bufferin)-1, 0); //接收client发送的信息// //ssize_t n = (s->GetSockfd(), bufferin, sizeof(bufferin)-1);// if(n > 0)// {//     bufferin[n] = 0;//     std::string ret;//     ret += peerip;//     ret += " ";//     ret += std::to_string(peerport);//     std::cout << ret << " " << "client say#" << bufferin << std::endl;// }// else// {//     break;// }}}~TcpServer(){delete _listensocket;}
private:int _port;Socket* _listensocket;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅写个登录(无js文件)

全部代码如下&#xff0c;无需编写wxss文件&#xff0c;渲染都在style里面&#xff1a; <view style"height: 250rpx;width: 100%;"> <!-- 背景图片 --><view style"position: absolute; background-color: antiquewhite; height: 250rpx;width…

IDEA中Docker相关操作的使用教程

一、引言 Docker作为当前最流行的容器化技术&#xff0c;极大地简化了应用的部署和管理。而IntelliJ IDEA作为一款强大的集成开发环境&#xff0c;也提供了对Docker的集成支持。本文将介绍如何在IDEA中配置和使用Docker&#xff0c;包括远程访问配置、服务连接、Dockerfile编写…

【C语言】冒泡排序算法详解

目录 一、算法原理二、算法分析时间复杂度空间复杂度稳定性 三、C语言实现四、Python实现 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基础的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列…

微信小程序开发笔记

微信小程序开发笔记 1 微信小程序的项目结构 2 页面组成 一个微信小程序是由一个或多个页面组成的&#xff0c;这些页面被存放在pages目录中。下面以pages 目录下的index页面为例展示其组成部分&#xff0c;index页面的组成部分如下图所示。 由上图可知&#xff0c;index页面…

hbase-2.2.7分布式搭建

一、下载上传解压 1.在官网或者云镜像网站下载jar包 华为云镜像站&#xff1a;Index of apache-local/hbase/2.2.7 2.上传到linux并解压 tar -zxvf hbase-2.2.7-bin.tar.gz -C /usr/locol/soft 二、配置环境变量 1. vim /etc/profile export HBASE_HOME/usr/local/soft/h…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 超文本&#xff1a;暂且理解为“超级的文本”&…

【opencv】dnn示例-segmentation.cpp 通过深度学习模型对图像进行实时语义分割

模型下载地址&#xff1a; http://dl.caffe.berkeleyvision.org/ 配置文件下载&#xff1a; https://github.com/opencv/opencv_extra/tree/4.x/testdata/dnn 该段代码是一个利用深度学习进行语义分割的OpenCV应用实例。下面将详细解释代码的功能和方法。 引入库 引入了一些必要…

(最详细)关于List和Set的区别与应用

关于List与Set的区别 List和Set都继承自Collection接口&#xff1b; List接口的实现类有三个&#xff1a;LinkedList、ArrayList、Vector。Set接口的实现类有两个&#xff1a;HashSet(底层由HashMap实现)、LinkedHashSet。 在List中&#xff0c;List.add()是基于数组的形式来添…

内部类

一.概念 当一个事物内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么将这个内部的完整结构最好使用内部类。在Java中&#xff0c;可以将一个类定义在另一个类或者一个方法内部&#xff0c;前…

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步&#xff0c;引入了可编程梯度信息&#xff08;PGI&#xff09;和通用高效层聚合网络&#xff08;GELAN&#xff09;等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进&#xff0c;在MS COCO数…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

【详细的Kylin使用心得】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

超级USB设备工具箱V2.0 绿色版-供大家学习研究参考

1、芯片精灵 ChipGenius V3.01 2、惠普U盘格式化工具 V2.2.0 3、MFormat V1.00中文版 4、MyDisk V2.50 5、安全移除USB磁盘&#xff08;Disk Ejector&#xff09; 6、U盘烧录修复工具&#xff08;PortFree Production Program&#xff09; V3.38 7、护U使者 V1.28 8、闪存精灵2…

【缺啥补啥】图表征学习-1

图表征学习&#xff1a; 学习图中的元素&#xff0c;如节点、边、子图或整个图的向量表征&#xff0c;并应用基于向量的机器学习算法进行图数据的建模和分析 动态环境&#xff1a; 图数据包括结构、特征、性质、任务等&#xff0c;随时间发生变化 开放环境&#xff1a; 泛指数据…

如何批量给Word文件增加前缀序号?“汇帮批量重命名”帮助你批量给word文件增加前缀序号。

批量给Word文件增加前缀序号的过程&#xff0c;对于经常处理大量文档的人来说&#xff0c;是一项既繁琐又必要的任务。首先&#xff0c;我们需要明确为什么要给Word文件增加前缀序号。在很多情况下&#xff0c;当我们需要按照一定的顺序对多个文档进行管理和归档时&#xff0c;…

基于STC15系列库操作LED灯

一、准备工作 1. 基于STC15系列库的工程模板 参考&#xff1a;51单片机工程模板的建立&#xff08;基于STC15系列库&#xff09;-CSDN博客 2. Keil编译器 二、程序编写 1. 新建 led.c 和 led.h 文件并存放于 user/led 文件夹下&#xff1b; 2. 新建 user.c 和 user.h 文件并…

如何辨别:DNS污染or DNS劫持?

DNS劫持和DNS污染的情况在互联网中并不少见&#xff0c;到底是出现了DNS污染还是DNS劫持。什么是DNS污染&#xff1f;什么是DNS劫持&#xff1f;我们该如何辨别DNS污染和DNS劫持&#xff1f; DNS劫持&#xff1a; DNS 劫持是指恶意攻击者通过非法手段篡改了网络中的 DNS 服务…

android 创建module

文章目的&#xff1a; 快速创建module并使用 创建步骤&#xff1a; 1 创建module 2 修改module下的build.gradle文件 3 修改清单文件中MainActivity属性&#xff0c;否则APP会因为有多个启动界面而崩溃 4 在主项目build.gradle引用该object Module 至此&#xff0c;可在APP中…