当前位置: 首页 > news >正文

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录

服务器端

代码

客户端

代码解析

服务器端

原理

遇到的阻碍以及解决办法

客户端

原理

遇到的阻碍以及解决办法

运行结果截图

总结


服务器端

代码

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <iostream>
#include <thread>
#include <list>
using namespace std;
#define PORT 8806
#define IP "127.0.0.1"
int msocket;
struct sockaddr_in servaddr;
socklen_t m_len;
list<int> connList;
void addPerson(){while(1){int f_socket=accept(msocket,(struct sockaddr *) &servaddr,&m_len);connList.push_back(f_socket);cout<<"玩家"<<f_socket<<":进入房间"<<endl;}
}
void sendList(int f_socket){for(int i=0;i<=connList.size()-1;i++){char buf_1[1024];memset(buf_1,0,sizeof(buf_1));sprintf(buf_1,"玩家%d(在线)\n",i+3);send(f_socket,buf_1,sizeof(buf_1),0);}
}
void recv_meg(){struct timeval tv;tv.tv_sec=0;tv.tv_usec=0;list<int>::iterator it;while(true){for(it=connList.begin();it!=connList.end();it++){fd_set rds;FD_ZERO(&rds);int max_fd=0;int reval=0;FD_SET(*it,&rds);if(*it>max_fd){max_fd=*it;}reval=select(max_fd+1,&rds,NULL,NULL,&tv);if(reval==-1){cout<<"error"<<endl;}else if(reval==0){//pass}else{char buf[1024];memset(buf,0,sizeof(buf));int len_1=recv(*it,buf,sizeof(buf),0);if(len_1>0){if(buf[0]=='#'){sendList(*it);}cout<<"收到"<<*it<<"玩家的消息:";cout<<buf<<endl;}}}}}
int main(){msocket=socket(AF_INET,SOCK_STREAM,0);memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(PORT);if(bind(msocket,(struct sockaddr*) &servaddr,sizeof(servaddr))==-1){perror("bind");exit(1);}if(listen(msocket,20)==-1){perror("listen");exit(1);}m_len=sizeof(servaddr);thread thr_1(recv_meg);thr_1.detach();thread th_2(addPerson);th_2.detach();while(1){}return 0;
}

客户端

#include <iostream>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstring>
using namespace std;
#define PORT 8806
int main(){int socket_1;fd_set rds;FD_ZERO(&rds);struct timeval tv;socket_1=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in servaddr;servaddr.sin_family=AF_INET;servaddr.sin_port=htons(PORT);servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");if(connect(socket_1,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){perror("connect");exit(1);}while(1){tv.tv_sec=10;tv.tv_usec=0;FD_ZERO(&rds);FD_SET(0,&rds);FD_SET(socket_1,&rds);int max_fd=0;int reval=0;if(max_fd<socket_1){max_fd=socket_1;}reval=select(max_fd+1,&rds,NULL,NULL,&tv);if(reval==-1){cout<<"error!"<<endl;}else if(reval==0){//pass}else{if(FD_ISSET(socket_1,&rds)){char buf_2 [1024];int len_1=recv(socket_1,buf_2,sizeof(buf_2,0),0);if(len_1>0){cout.write(buf_2,len_1);}memset(buf_2,0,sizeof(buf_2));}if(FD_ISSET(0,&rds)){char buf_3 [1024];fgets(buf_3,sizeof(buf_3),stdin);send(socket_1,buf_3,sizeof(buf_3),0);memset(buf_3,0,sizeof(buf_3));}}}return 0;
}

代码解析

服务器端

原理

创建了一个套接字绑定端口和ip地址

之后创建一个线程用于接收外面的连接请求并且把生成的客户端的套接字存储到connList的链表中

之后用在又创建以线程用select函数来判断是否有客户端进行发送请求,如果有判断第一个首字母是否为'#'如果是那么就放回发送connList链表

遇到的阻碍以及解决办法

  • 发送的数据的时候最好加一个\n,因为客户端没有换行,所以打印的时候就会怪怪的
  • 由于是第一次实战,开始那个大小端互相转化把我搞懵了,索性本来也就不难干脆就记下来就行了。
  • 创建的服务器套接字以及客户端生成的套接字容易搞混,用命名把它分开来了。
  • 超时时间目前服务器端来看没什么用反而会影响新客户端的连接,服务器端会遍历套接字列表,如果在等待的时候有新的连接进行请求依旧会继续堵塞(因为他一次只能select一个套接字)

客户端

原理

客户端就只有一个主函数,同样绑定套接字之后,用select用来判断是否有输入或者接受请求,如果有输入则发送输入字节流,如果有接收请求则调用接收函数并且将其打印出来

遇到的阻碍以及解决办法

  • 打印输出的列表用printf函数或者用cout.write(字符串,长度)不要用cout函数会乱码——printf函数根据格式化字符串来输出数据,而cout在默认情况下将字符串视为null-terminated字符串,即以’\0’结尾。所以,如果buf_2中的数据不是以’\0’结尾的,cout将会继续输出直到遇到’\0’为止,可能造成输出乱码。
  • 这里可以设置超时时间,因为它只是监听套接字和输入流,没有上面服务器端一样的遍历。

运行结果截图

总结

一个基于

C++入门教程(18)socket 实现简单聊天室_std socket_爱我呦呦的博客-CSDN博客文章浏览阅读8.6k次,点赞8次,收藏88次。本节通过socket实现一个简单的聊天室功能聊天室中如果有人说话,则服务器负责将内容传送给聊天室的其他人那么就需要客户端和服务端两个程序,客户端负责发送消息,服务端负责接收和转发消息客户端代码:#include #include #include #include #include #in_std sockethttps://blog.csdn.net/u011416077/article/details/123593428的拓展功能。并且把一些不足之处给指出来了。

相关文章:

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…...

c++11新特性篇-可调用对象包装器, 绑定器

可调用对象包装器, 绑定器 可调用对象 可调用对象是指在 C 中能够像函数一样被调用的实体。它包括了多种类型的对象&#xff0c;使得它们能够像函数一样被调用&#xff0c;可以是函数、函数指针、函数对象、Lambda 表达式等。在C中&#xff0c;具有以下特征之一的实体都被认为…...

论文阅读:“Appearance Capture and Modeling of Human Teeth”

文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影&#xff0c;游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…...

初学vue3与ts:路由跳转带参数

index-router <!-- 路由跳转 --> <template><div><div class"title-sub flex"><div>1、用router-link跳转带参数id1&#xff1a;</div><router-link to"./link?id1"><button>点我跳转</button>&…...

JAVAEE---多线程

线程安全 这段代码执行结果就就是一个不确定的数&#xff0c;就存在线程安全问题。 为了解决这样的问题我们可以对count进行打包&#xff0c;我们知道count本质上应该是由三个指令完成&#xff0c;我们可以对其打包。 这样的代码结果就是正确的。我们对对象就进行了加锁&#…...

提示工程-Prompt Engineering

提示工程 提示工程 1、概述 Prompt Engineering&#xff1a; 提示工程 通过自然语言&#xff08;英语、汉语等&#xff09;来给AI下达指示&#xff0c;从而让AI完成你指定给他的工作的过程都可以称之为提示工程。&#xff08;面向自然语言编程&#xff09; 提示词要素 指令&…...

JetLinks设备接入的认识与理解【woodwhales.cn】

为了更好的阅读体验&#xff0c;建议移步至笔者的博客阅读&#xff1a;JetLinks设备接入的认识与理解 1、认识 JetLinks 1.1、官网文档 官网&#xff1a;https://www.jetlinks.cn/ JetLinks 有两个产品&#xff1a;JetLinks-lot和JetLinks-view 官方文档&#xff1a; JetLi…...

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…...

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …...

【Kotlin】类与接口

文章目录 类的定义创建类的实例构造函数主构造函数次构造函数init语句块 数据类的定义数据类定义了componentN方法 继承AnyAny&#xff1a;非空类型的根类型Any?&#xff1a;所有类型的根类型 覆盖方法覆盖属性覆盖 抽象类接口:使用interface关键字函数&#xff1a;funUnit:让…...

Wagtail-基于Python Django的内容管理系统CMS如何实现公网访问

Wagtail-基于Python Django的内容管理系统CMS实现公网访问 文章目录 Wagtail-基于Python Django的内容管理系统CMS实现公网访问前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个…...

什么是LASSO回归,怎么看懂LASSO回归的结果

随着机器学习的发展&#xff0c;越来越多SCI文章都使用了更多有趣、高效的统计方法来进行分析&#xff0c;LASSO回归就是其中之一。很多小伙伴听说过LASSO&#xff0c;但是对于LASSO是什么&#xff0c;有什么用&#xff0c;怎么才能实现&#xff0c;大家可能一头雾水。今天的文…...

python树长子兄弟链存储结构(孩子兄弟链存储结构)

长子兄弟链存储结构&#xff08;孩子兄弟链存储结构&#xff09;解释&#xff1a; 长子兄弟链存储结构是一种树的存储结构&#xff0c;它使用孩子兄弟表示法&#xff08;也称作左孩子右兄弟表示法&#xff09;来表示树的结构。这种表示方法主要用于存储一般的树&#xff0c;而不…...

开源和闭源软件对开发的影响

开源软件的优势&#xff1a; 开源性&#xff1a;开源软件允许任何人查看、修改和发布源代码&#xff0c;这促进了代码的共享和集体学习。透明性&#xff1a;开源软件提高了软件的透明度&#xff0c;使用户可以更好地理解软件的工作原理&#xff0c;增加对软件的信任。社区支持…...

centos无法进入系统之原因解决办法集合

前言 可爱的小伙伴们&#xff0c;由于精力有限&#xff0c;暂时整理了两类。如果没有你遇到的问题也没有关系&#xff0c;欢迎底下留言评论或私信&#xff0c;小编看到后第一时间帮助解决 一. Centos 7 LVM xfs文件系统修复 情况1&#xff1a; [sda] Assuming drive cache:…...

【Linux】系统初始化配置

CentOS 7 的虚拟机安装后必须要做的几个操作&#xff0c;记录以下&#xff0c;网络配置修改、yum源安装、基础工具安装&#xff1a; 1、先修改权限&#xff0c;新建普通用户&#xff0c;并授权普通用户apps 的sudo权限&#xff1b; useradd apps password apps visudo apps A…...

使用VC++设计程序对一幅256级灰度图像进行全局固定阈值分割、自适应阈值分割

图像分割–全局固定阈值分割、自适应阈值分割 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章&#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、…...

【ArcGIS Pro微课1000例】0035:栅格影像拼接(dem高程数据)

本实验讲解在ArcGIS Pro中,栅格数据的两种拼接(镶嵌)方法,适用于遥感影像、DOM、DEM、DSM等常见栅格数据。 文章目录 一、加载实验数据二、栅格拼接工具1. 镶嵌2. 镶嵌至新栅格三、注意事项四、拓展阅读一、加载实验数据 加载配套实验数据中的0035.rar中的两个dem数据,如…...

Zynq-7000系列FPGA使用 Video Processing Subsystem 实现图像缩放,提供工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案自己写的HLS图像缩放方案 3、设计思路详解Video Processing Subsystem 介绍 4、工程代码详解PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项…...

【C】内存函数

目录 1. memcpy 使用和模拟实现 2. memmove 使⽤和模拟实现 3. memset 函数的使用 4. memcmp 函数的使用 1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到d…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...