linux下实现 多客户端访问服务器

【树莓派实战】借助cpolar内网穿透,打造随时可访的私人Linux服务器 本文详细介绍了如何利用cpolar内网穿透工具,将树莓派从本地设备转变为可随时随地访问的私人Linux服务器。通过安全配置、cpolar客户端部署及SSH隧道创建,实现稳定可靠的远程访问,解决了公网IP缺失的难题,极大提升了树莓派的实用性与便捷性。 阅读详情

io多路复用的select实现服务器,支持多个客户端同时访问服务器。

服务器实现:

#include  <unistd.h>
#include  <sys/types.h>       
#include  <sys/socket.h>      
#include  <netinet/in.h>      
#include  <arpa/inet.h>       
#include <sys/select.h>       
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

#define MAXMSG 1024

//处理信息接口
void handleMsg(int * clientSockFds, int maxFds, fd_set* pRset, fd_set* pAllset,const char* str)
{
    char buf[MAXMSG];
	char printBuf[MAXMSG];
	
	int i;
    for (i = 0; i< maxFds; i++) 
	{
        if (clientSockFds[i] != -1) //如果条件成立,则有连接的客户端
		{
            if (FD_ISSET(clientSockFds[i], pRset)) //判断是哪一个客户端的事件
			{
                int nread = read(clientSockFds[i], buf, MAXMSG);	//读取客户端socket流
                if (nread < 0) //对方异常。
				{
                    perror("read error");
                    close(clientSockFds[i]);
                    FD_CLR(clientSockFds[i], pAllset);
                    clientSockFds[i] = -1;
                    continue;
                }
                else if (nread == 0) //对方挂断,返回0
				{
					printf("%s",str);
                    printf(" client close the connection\n");
                    close(clientSockFds[i]);
					
					//如果对方挂断。则从文件集中清除监听该文件描述符
                    FD_CLR(clientSockFds[i], pAllset);
                    clientSockFds[i] = -1;
                    continue;
                } 
				else if (nread > 0)
				{
					sprintf(printBuf,"%s: %s",str,buf);
					printf("recv %s\n", printBuf);
				}	
                //write(clientSockFds[i], buf, nread);	
            }
        }
    }
}

int  main(int argc, char **argv)
{
    int  servPort = 6666;

    char buf[MAXMSG];
    int clientSockFds[FD_SETSIZE];
	printf("FD_SETSIZE=%d\n",FD_SETSIZE);

	//1、创建套接字
    int socketfd = socket(AF_INET, SOCK_STREAM, 0);
    if (socketfd < 0) 
	{
        perror("socket error");
        return -1;
    }
	
	//作用就是程序异常退出,再重新运行不会绑定端口失败
	int opt = 1;
    if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
        perror("setsockopt error");    
    }   
	
	//2、配置网络
	struct sockaddr_in clientaddr, serveraddr;
	bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = INADDR_ANY;
    serveraddr.sin_port = htons(servPort);
	
	int socklen=sizeof(struct sockaddr_in);
	//3、绑定
	if(bind(socketfd,(struct sockaddr*)&serveraddr,socklen) == -1) 
	{
        perror("bind error");
        exit(-1);
    }
	
	//4、监听
	if (listen(socketfd, 1024) < 0) 
	{
        perror("listen error");
        return -1;
    }
	
	int i = 0;
    for (i = 0; i< FD_SETSIZE; i++) 
	{
        clientSockFds[i] = -1;  //给客户端文件描述符赋值
	}
	
	
	fd_set allset, rset; //声明文件描述符
    FD_ZERO(&allset); //把集合设置为空集 
	
	//5、将监听的socketfd 放到select集合中监听 
    FD_SET(socketfd, &allset);  
	
    int maxfd = socketfd;   
	
	printf("server port is %d\n", servPort);
    printf("max connection: %d\n", FD_SETSIZE);
	while (1) 
	{
		//因为select 每收到一次监听事件,便会从rset把相应的文件描述符从监听集合中清除 
		rset = allset; //定义两个文件集合,一个用来备份
		
		//6、select阻塞
        int nready = select(maxfd + 1, &rset, NULL, NULL, NULL);  
        if (nready < 0) 
		{
            perror("select error");
            continue;
        }
		
		//7、如果服务端的套接字有活动
        if (FD_ISSET(socketfd, &rset)) 
		{
			//8、接收连接
            int connfd = accept(socketfd, (struct sockaddr*) &clientaddr, &socklen); 
            if (connfd < 0) 
			{
                perror("accept error");
                continue;
            }

            sprintf(buf, "connect from %s:%d", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
            printf("%s\n",buf);
			
            for (i = 0; i< FD_SETSIZE; i++) 
			{
                if (clientSockFds[i] == -1)  //
				{
                    clientSockFds[i] = connfd; //将客户端连接的文件描述符放到clientSockFds数组
                    break;
                }
            }
			
            if (i == FD_SETSIZE) 
			{
                fprintf(stderr, "too many connection, more than %d\n", FD_SETSIZE);
                close(connfd);
                continue;
            }
			
            if (connfd > maxfd)
			{
                maxfd = connfd;
			}
				
			//添加或者删除都留着allset
            FD_SET(connfd, &allset);
            
			//超时继续
			if (--nready <= 0)
                continue;
        }
		//9、处理客户端发送的信息
        handleMsg(clientSockFds, maxfd, &rset, &allset,buf);
    }
}


客户端实现:

#include <unistd.h>
#include <sys/types.h>       
#include <sys/socket.h>      
#include <netinet/in.h>      
#include <arpa/inet.h>       
#include <sys/select.h>       
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

#define MAXMSG 1024

int main()
{
	int connfd=socket(AF_INET,SOCK_STREAM,0);
	if(connfd==-1)
	{
		printf("creat socket failed\n");
	}
	
	//取消端口绑定限制
	int opt = 1;
	if (setsockopt(connfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))<0)
	{
		printf("setsockopt failed\n");
		return -1;
	}
	
	struct sockaddr_in addrSrc;
	bzero(&addrSrc,sizeof(addrSrc));
	
	addrSrc.sin_family=AF_INET;
	addrSrc.sin_port=htons(6666);
	addrSrc.sin_addr.s_addr=inet_addr("127.0.0.1");
	
	if (connect(connfd, (struct sockaddr *) &addrSrc, sizeof(addrSrc)) < 0) 
	{
        printf("connect error\n");
        return -1;
    }
	
    printf("This is client\n");
    while(1)
	{
		//发送信息
		char sendBuf[100]={0};
		scanf("%s",sendBuf);
		send(connfd,sendBuf,strlen(sendBuf)+1,0);
	}		
    close(connfd);
    printf("exit\n");
	
    return 0;
}

 

Linux下使用select实现多客户端聊天室项目实战 TCP/IP协议栈是现代网络通信的核心架构,它将网络通信过程划分为四层模型:应用层、传输层、网络层(或称互联网层)和链路层(或称网络接口层)。每一层都有其特定的功能,并通过接口与相邻层进行数据交换。层级功能描述典型协议应用层提供应用程序接口,面向用户传输层负责端到端的数据传输TCP、UDP网络层负责数据包的路由选择IP、ICMP链路层负责物理媒介上的数据传输TCP/IP协议栈的工作流程如下图所示:graph TD。 阅读详情

相关推荐

以前写过的linux下tcp多客户端通信程序

以前写的网络编程,压缩包内包括TCP客户端和TCP服务器,用到线程,编译时记得加上-lpthread

SSH远程访问及控制

目录 SSH远程管理 SSH远程登录 openssh服务配置与管理 openssh服务器 密钥:密钥优先级高于密码 TCP Wrappers访 问控制 安全级别设置 总结 一,SSH远程管理 1.SSH(secure shell)协议 2.OpenSSH 3.远程管理Linux系统基本上都要使用ssh 二,SSH远程登录 1.方法一: 2.方法二: 3.SSH登录到别的Linux主机,登录被禁止的解决方法: 三,openssh服务配置与管理 1.服务配置 2.安全调优

qingqui_的博客 6291

TortoiseSVN的安装与使用

TortoiseSVN的安装与应用1、安装1.1、下载TortoiseSVN    点击下载TortoiseSvn1.2、下载汉化包。上面的页面中,找到Chinese, simplified汉化包,点击32位或者64位的Setup,下载汉化包。1.3、安装TortoiseSVN。在选择安装路径页面时要记得勾选“command line client tools”,默认不是勾选的。这里不勾选的话在I...

qq_28566071的博客 4万+

服务器如何跟多个客户端进行通讯呢?

服务器如何跟多个客户端进行通讯呢? 一、多客户端连接: 当有多个客户端和服务器连接时,服务器就需要为每个客户端创建新连接 二、连接完毕后,服务器要为每个客户端产生用于通讯的Socket与客户端进行通讯,把此Socket保存到集合中,使用远程终结点进行区分每个连接,可以保存在集合中(比如List,Dictionary..),可以实现,与客户端单聊和群发的功能。 三、接收客户端消息: 服务端

Newd's Blog 3513

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2359

linux打开多个应用程序,在Ubuntu中同时打开多个应用程序 | MOS86

当您在计算机上工作时,您可能需要处理多个应用程序。例如,当我在撰写文章时,我需要打开Firefox,Hotshots,GIMP,Autokey等应用程序。标准的方法是一次打开一个应用程序。更有效的方式是通过单个命令(或鼠标点击)同时打开这些应用程序。在本快速教程中,我将向您展示如何在Linux中同时打开多个应用程序。Note:本教程是在Ubuntu上完成的,但它可以在任何Linux发行版,甚至在M...

weixin_36212560的博客 2188

Python爬虫实战:抓取统计数据并生成年度对比图表详解

国家统计局网站(静态HTML页面Excel文件JSON接口(部分新版API)我们将重点演示从统计公报页面抓取数据,结合解析Excel文件,实现多种数据格式爬取处理。本文从零开始搭建了一个爬取国家统计数据并制作年度对比图表的完整流程。读者可以根据实际需求调整爬取目标,丰富数据分析维度,甚至结合机器学习模型预测未来趋势。欢迎你在评论区留言分享你的爬虫实践,或提出改进建议!

2201_76125261的博客 1000

Linux下Socket编程利用多进程实现一台服务器与多台客户端并发通信

前些日子同“Linux应用编程”专栏中发布过的TCP及UDP在Linux或Windows下的通信都为单进程下的Socket编程,若还存在一些套接字相关函数模糊不清,读者可移步“Socket编程下tcp通信”和“Socket编程下udp通信”重温学习。本篇则是对以上俩篇的一个简单提升运用,或者说是对以后多线程/进程工作的简单示例。PF_INET 和 AF_INET 的区别:在Windows中,AF_INET与PF_INET完全一样,而在Unix/Linux系统中,在不同的版本中这两者有微小差别。

Bit_Dong的博客 1933

基于STM32L4XX 、HAL库的SGM452B数字温度传感器驱动应用C语言程序设计

SGM452B_RESOLUTION_12BIT = SGM452B_CONFIG_R1 | SGM452B_CONFIG_R0 /* 12位分辨率,精度0.0625°C,转换时间200ms */SGM452B_RESOLUTION_11BIT = SGM452B_CONFIG_R1, /* 11位分辨率,精度0.125°C,转换时间100ms */SGM452B_RESOLUTION_10BIT = SGM452B_CONFIG_R0, /* 10位分辨率,精度0.25°C,转换时间50ms */

PP_Cottage的博客 327

YOLOv8与UNetV2融合:一种面向目标检测与图像分割的混合方法【附核心代码】

我们提出了一种基于YOLOv8和UNetV2相结合的混合架构。该架构利用YOLOv8作为主干进行目标检测,同时在YOLOv8的特征提取过程中,引入UNetV2来进行图像分割任务的增强。在该架构中,YOLOv8负责大范围目标检测和位置预测,而UNetV2则在检测网络的特征图基础上,通过其高效的上下文信息提取和细节恢复能力,进一步优化分割任务。在本文中,我们提出了一种改进YOLOv8的方法,通过引入图像分割网络UNetV2来提高图像分割检测性能。

一键难忘的博客 3524

Linux24 -- tcp相关概念、多个客户端链接服务端代码

tcp相关概念 多个客户端链接服务端代码

kyrie_sakura的博客 999

把开源 Skills 集成到 LangGraph 项目

1. 定义智能体状态(必须包含 messages,其他字段按需扩展)messages: List[HumanMessage | AIMessage | ToolMessage] # 消息流(核心)skill_output: Optional[str] # 存储 Skill 执行结果next_node: str # 控制流程跳转# 2. 定义智能体决策节点(决定是否调用 Skill)"""智能体决策逻辑:根据用户输入判断是否调用开源 Skill"""# 获取最后一条用户消息。

lpfasd123的博客 897

嵌入式Linux的web视频服务器的构建

  随着嵌入式处理器和开源Linux 的广泛应用,各种视频服务在嵌入式系统中逐渐发展起来。     1.引言    随着多媒体技术、视频压缩编码技术、网络通讯技术的发展,数字视频服务器逐渐发展起来。近年来随着嵌入式处理器和开源Linux 的广泛应用,视频服务已逐渐与嵌入式相结合。本文提出了一种嵌入式 web 视频服务器的构建方法,该系统以嵌入式 Linux 和 S3C2440 为核心平台...

xujinquan19的专栏 173

【WRF数据准备】海温(SST)数据替换

【WRF数据准备】海温(SST)数据替换

WW、forever的博客 1117

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

嵌入式web的实现

嵌入式Linux的web视频服务器的构建 2010-12-07 10:49:39 标签:嵌入式Linux 视频采集 linux web 服务器 休闲        随着嵌入式处理器和开源Linux 的广泛应用,各种视频服务在嵌入式系统中逐渐发展起来。 1.引言        随着多媒体技术、视频压缩编码技术、网络通讯技术的发展,数字视频服务器逐渐发展起来。近年来随着

zhangzhangjiji的专栏 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

2017-2018-1 20155230 实验三 实时系统

 实现利用Socket编程实现客户端访问服务器实现Linux系统下wc命令的统计单词数,并能实现多客户端访问。 客户端: #include <stdio.h> #include <netinet/in.h> #include &lt...

aohuang6078的博客 136

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

两则培训参考:从知识灌输到实战练习的培训设计

企业培训正从大而全的课程体系转向小而精的实战片段,核心在于将知识灌输转化为可追踪的练习与带教机制。基于生成效应,学员主动练习比被动听讲更有效,三遍练习法(跟着做、独立做、限时做)能显著提升技能掌握度。同时,老带新需从人情驱动转为机制驱动,通过四阶段带教清单和业务结果挂钩的激励,确保培训可追踪、可量化。这些方法适用于新人带教、技能传授等场景,帮助团队快速提升实战能力,实现培训效果的最大化。

weixin_34396103的博客 477

TVHeadend实战指南:高效搭建个人电视服务器的完整方案

想要在任何设备上流畅观看电视节目,还能随心录制喜爱的内容吗?TVHeadend作为Linux平台上功能最全面的个人电视服务器解决方案,支持ATSC、DVB-C/C2、DVB-S/S2、DVB-T/T2、IPTV、SAT>IP等多种信号源输入,让你轻松打造专属的家庭娱乐中心。本文将手把手教你从零开始构建一个稳定可靠的TVHeadend电视服务器。 ## 快速部署:三种安装方式任你选 **Dock

gitblog_00600的博客 1100

Suwayomi-Server:终极桌面漫画阅读器完整指南

想要在电脑上享受流畅的漫画阅读体验吗?Suwayomi-Server 是一款免费开源的桌面漫画阅读器服务器,能够运行专为 Tachiyomi 设计的扩展,让你在 Windows、Linux、macOS 等主流操作系统上都能畅读漫画!🚀 ## 什么是 Suwayomi-Server? Suwayomi-Server 是 Tachiyomi 的桌面重写版本,作为一个独立的多平台漫画阅读服务器,它

gitblog_00827的博客 1327

CyberStrikeAI 部署教程:15 分钟跑通第一个 AI 渗透测试任务

CyberStrikeAI 把自然语言指令转化为可审计的安全工具调用,并统一沉淀证据、漏洞与资产。本文带你完成环境确认、一键部署和首次配置,15 分钟内亲手跑通第一个真实扫描任务。 不用记 nmap、sqlmap、nuclei 的参数,也不用在多个终端之间搬运结果。过去你手动拼命令、截图东一张西一张、报告靠事后整理,复测同一目标还要从零开始;接入 CyberStrikeAI 之后,一句自然语言指

gitblog_00471的博客 237

轻量级运维利器:Beszel 监控平台安装与 cpolar 内网穿透配置全记录

轻量级运维利器:Beszel 监控平台安装与配置指南 本文介绍了轻量级服务器监控工具Beszel的安装与配置过程。Beszel是一款专为现代服务器环境设计的监控平台,尤其擅长Docker容器监控,具有界面简洁、资源占用低、告警功能强大等特点。文章详细演示了在Ubuntu 22.04环境下通过Docker部署Beszel主控端的步骤,包括环境准备、创建数据目录、启动容器等操作。同时介绍了如何通过浏览器访问Beszel界面、创建管理员账号,以及添加客户端(包括Docker方式和二进制方式)的配置方法。Besze

博客 1万+

Rubick 插件指南:从一键安装到快捷键设置的完整流程

Rubick 是基于 Electron 的开源桌面工具箱,核心能力是自由集成丰富的 **Rubick 插件**:系统工具、开发者工具、搜索插件,都能在内置**插件市场**里检索并安装,不用在多个工具之间来回切换。下面按“安装 → 配置 → 场景 → 维护”的动线,把这套插件体系讲一遍。 [![Rubick 插件市场的分类与插件列表](https://raw.gitcode.com/gh_mirr

gitblog_00045的博客 945

如何搭建MoWorld训练环境:CANN、torch_npu与MindSpeed技术栈完整实战

MoWorld 是运行在昇腾 NPU 上的高性能闪速世界模型(Flash World Model),用于实时交互式视频生成。搭建 **MoWorld 训练环境** 的核心,是让 **CANN**、**torch_npu** 与 **MindSpeed** 三者版本严格对齐——本文按"平台准备 → 依赖安装 → 权重转换 → 启动训练"的完整流程实操演示,带你一次性跑通 MoWorld 预训练。

gitblog_00100的博客 163

服务器文件访问协议

本篇博客参考网上文档和博客,对基于网络的服务器/主机的文件访问、共享协议进行简要总结,完整内容将会不断更新,以便加深理解和记忆

路遥知马力,日久见人心 1780
上一篇: linux下tcp编程
下一篇: 澳门一日游记
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值