#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#define TRUE 1
#define PORT 51500
int main(int argc, char *argv[]) {
int master_sock,
addrlen,
new_sock,
maximum_clients = 30,
client_sock[maximum_clients],
act,
i,
value_read,
sock_descriptor,
maximum_socket_descriptor;
struct sockaddr_in adr{};
char buff[1024]; //data buffer of 1K
fd_set read_fds; //set of socket file descriptors
char *message = "ECHO Daemon v1.0 \r\n"; //connect notice message
//initialise all client_sock to 0
for (i = 0; i < maximum_clients; i++) {
client_sock[i] = 0;
}
//creating a master socket
if ((master_sock = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Failed_Socket");
exit(EXIT_FAILURE);
}
//These are the types of sockets that we have created
adr.sin_family = AF_INET;//PROTOCOL = IP
adr.sin_addr.s_addr = INADDR_ANY;//SOURCE ADDRESS = 0.0.0.0/0
adr.sin_port = htons(PORT);//LISTENING PORT = PORT
//bind the socket to localhost port
if (bind(master_sock, (struct sockaddr *) &adr, sizeof(adr)) < 0) {
perror("Failed_Bind");
exit(EXIT_FAILURE);
}
printf("Port having listener: %d \n", PORT);
//Specify 3 as maximum pending connections for master socket
if (listen(master_sock, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
//Accepting the Incoming Connection
addrlen = sizeof(adr);
puts("Looking For Connections");
//*******************************//
// Here we start using select functions and the macros for multiple client handling
while (TRUE) {
//Clearing the socket set
FD_ZERO(&read_fds);
//Adding the master socket to the set
FD_SET(master_sock, &read_fds);
maximum_socket_descriptor = master_sock;
//Adding child sockets to set
for (i = 0; i < maximum_clients; i++) {
//Descriptor for Socket
sock_descriptor = client_sock[i];
//if the socket descriptor is valid then adding it to the read list
if (sock_descriptor > 0) {
FD_SET(sock_descriptor, &read_fds);
}
//Highest File Descriptor Number which is needed for the select function
if (sock_descriptor > maximum_socket_descriptor) {
maximum_socket_descriptor = sock_descriptor;
}
}
//Waiting for something to happen on the master socket. As the wait time is NULL the wait is indefinite
act = select(maximum_socket_descriptor + 1, &read_fds, nullptr, nullptr, nullptr);
if ((act < 0) && (errno != EINTR)) {
printf("Failed_Select");
}
//Any activity on the master socket is treated as an incoming connection
if (FD_ISSET(master_sock, &read_fds)) {
if ((new_sock = accept(master_sock, (struct sockaddr *) &adr, (socklen_t *) &addrlen)) < 0) {
perror("Accept!");
exit(EXIT_FAILURE);
}
//Informing the user of the socket number which will be sued to send and receive messages
printf("This is a New Connection,The socket file descriptor is %d and the IP is : %s on Port : %d\n",
new_sock,
inet_ntoa(adr.sin_addr),
ntohs(adr.sin_port));
// Sending Greeting Message on New Connection
if (send(new_sock, message, strlen(message), 0) != strlen(message)) {
perror("Send!!");
}
puts("Welcome Text Sent Affirmative.");
// Adding new socket to the array of sockets
for (i = 0; i < maximum_clients; i++) {
// Checking if the position is empty
if (client_sock[i] == 0) {
client_sock[i] = new_sock;
printf("Adding new socket to the list of sockets as %d\n", i);
break;
}
}
}
//If not the master socket then it is some i/o activity on some other socket
for (i = 0; i < maximum_clients; i++) {
sock_descriptor = client_sock[i];
if (FD_ISSET(sock_descriptor, &read_fds)) {
//Checking if the activity was for closing and reading the incoming message
if ((value_read = read(sock_descriptor, buff, 1024)) == 0) {
//If someone disconnected, getting their details and printing a message
getpeername(sock_descriptor, (struct sockaddr *) &adr, (socklen_t *) &addrlen);
printf("Disconnected Host. Their , IP %s and PORT %d \n",
inet_ntoa(adr.sin_addr), ntohs(adr.sin_port));
//Closing the socket and marking it as 0 in the list to be reused
close(sock_descriptor);
client_sock[i] = 0;
} else {
//Setting the string terminating NULL byte on the end of the data that is read
buff[value_read] = '\0';
//Echoing back the message that came in the socket
send(sock_descriptor, buff, strlen(buff), 0);
}
}
}
}
return 0;
}
相关推荐
【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02
字段内容类型云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)。
C Socket Programming for Linux with a Server and Client Example Code
Typically two processes communicate with each other on a single system through one of the following inter process communication techniques. Pipes Message queues Shared memory There are se...
【 infrastructure】【数据中心】【AI infra】第十篇 智能计算数据中心解决方案集成测试和交付知识体系1005
路由协议需要同时处理动态拓扑(LEO)和静态拓扑(GEO),BGP 的收敛速度无法跟上 LEO 切换(秒级),而 OSPF 的 LSDB 更新过于频繁。mode 4(LACP)需要交换机支持,mode 0(round-robin)可能乱序,mode 2(active-backup)带宽利用率低。使用 DCB(Data Center Bridging)配置 PFC 优先级映射,将 RoCE 流量映射到高优先级(3 或 4),其他流量低优先级。或者使用异步 NVMe-oF,允许命令排队,容忍延迟。
C 语言快速参考备忘清单:从基础语法到 Socket 网络编程的完整速查(Reference 项目 docs/c.md)
> 本文以开源仓库 jaywcjlove/reference(为开发人员分享快速参考备忘清单【速查表】的项目)中的 [C 备忘清单](https://link.gitcode.com/i/97b160ee1aca359010fcb5dc00ab4a4c) 为骨架,系统梳理 C 语言的基本语法、运算符、数据类型、预处理器、函数、结构体、文件处理、Socket 网络编程与 I/O 多路复用等核心知识点
【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现
ANSYS的结构刚度矩阵提取中一些操作技巧
GD-Link离线烧录全攻略:从配置到一键下载的保姆级教程
本文详细介绍了GD-Link离线烧录的全流程,从硬件准备到软件配置,再到一键下载的实战技巧。通过保姆级教程,帮助工程师快速掌握国产MCU的离线烧录技术,适用于产线批量烧录和现场设备维护等场景,显著提升工作效率。
C++AI编译错误自动修复神器-告别手动Debug的终极方案
在日常 C++ 开发中,编译错误是最频繁遇到的障碍之一。一个中等规模的项目在重构期间,一次 可能产生数十甚至上百条错误信息。这些错误往往具有级联效应——一个头文件的拼写错误可能导致下游十几个翻译单元同时报错,而真正需要修改的地方只有一处。传统的工作流是: 这个循环对于经验丰富的开发者来说尚可接受,但对于以下场景则效率极低:优势:局限:本项目最适合以下场景:阅读
Android车载应用开发:Kotlin与Automotive OS深度实践
Android Automotive OS(AAOS)是Google专为车辆设计的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto不同,AAOS允许开发者深度集成车辆硬件功能,如空调控制和传感器数据读取,同时遵循严格的驾驶安全规范。Kotlin作为开发语言,具备空安全设计、扩展函数和协程支持等优势,简化了开发流程。开发环境配置包括Android Studio、AAOS模拟器和Gradle配置,核心组件如CarAppService、Screen与模板系统,以及车辆
MYSQL 网络连接
assert(mp!= nullptr);#endif首先断言mp非空。为结构体动态分配内存,并将指针赋给。调用来初始化这个安全互斥锁,同时传入源文件名和行号。内部通常会:再调用初始化真正的原生互斥体。记录锁的创建位置、线程 ID 等信息,以便在死锁检测、锁定顺序检查或错误报告时提供调试信息。这种模式主要用于调试版本,帮助开发者发现互斥锁使用问题(如重复锁定、死锁、未释放等)。#else#endif直接调用初始化中的原生互斥体(例如或 Windows 的。
Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)
本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。
轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码
轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码
开源代码评审工作流:LLM+CLI驱动的结构化CR实践
代码评审(Code Review)是保障软件质量的核心工程活动,其本质是基于上下文的风险识别与设计决策验证。传统人工评审面临标准不统一、重复检查耗时、新人参与度低等痛点,而大语言模型(LLM)的引入需兼顾可解释性、可控性与可审计性。本文聚焦‘结构化评审’这一基础范式,强调通过 CLI 工具链实现 Git Diff 的语义解析、多粒度上下文注入、规则引擎与轻量 LLM 的协同推理,并将评审逻辑沉淀为 YAML 配置——即‘评审即代码(Review-as-Code)’。该方案不依赖黑盒 Agent 或复杂 Em
基于非接触式微波雷达设计的睡眠监控系统_323
本项目设计了一种基于非接触式微波雷达的睡眠监控系统,通过高精度的生理信号采集与分析,帮助用户全面了解自身的睡眠状态和健康状况。系统采用60GHz频段的R60ABD1毫米波雷达模块,实现对人体呼吸频率、心率、活动状态、体动幅度等参数的非接触式测量;结合MLX90614红外体温传感器,能够实时监测人体体温。此外,系统通过蜂鸣器报警和数据上云功能,及时向用户反馈异常生理指标,确保健康风险早期预警。数据通过ESP8266-WIFI模块上传至华为云物联网平台,用户可通过Android手机APP和Windows上位机远
工作中使用到的单词(软件开发)
1.エイリアス alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート promote 促进,提升 开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................
(二)OpenClaw-连接即时通讯平台-集成飞书完整配置指南
本文详细介绍了如何将OpenClaw与飞书机器人对接,实现通过飞书聊天窗口下达指令自动执行任务的高效协作模式。主要内容包括:1)OpenClaw服务部署验证和飞书账号准备;2)在飞书开放平台创建企业自建应用、添加机器人能力、获取凭证和开通必要权限;3)OpenClaw服务端的首次配置,包括设置飞书通道参数和启动长连接。文章提供了完整的操作步骤和截图指引,帮助用户快速完成对接配置,实现AI自动化助手功能。
2、Elixir与Erlang:构建高可用系统的利器
本文介绍了Elixir与Erlang在构建高可用系统方面的优势,深入探讨了Erlang的并发机制、容错能力以及分布式特性,并结合实际应用场景展示了其在服务器端开发中的强大能力。此外,还提供了学习资源和交流平台,帮助开发者快速上手并深入实践。
从零开始安装与使用pwntools:二进制安全与漏洞利用的Python利器
在二进制安全与漏洞利用领域,Python作为一种高效灵活的脚本语言,常被用于自动化安全测试与漏洞利用脚本的编写。其核心原理在于通过封装底层系统调用与网络通信,为安全研究人员提供了一套简洁的API接口,极大地提升了漏洞分析与利用的开发效率。这一技术价值在CTF竞赛、软件安全评估及漏洞研究中尤为突出,能够帮助开发者快速构建交互式攻击载荷、解析二进制文件信息以及自动化定位漏洞偏移。pwntools正是这一理念下的杰出实践,它是一个专为漏洞利用和二进制分析设计的Python框架,将繁琐的进程交互、数据打包和地址计算
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
脑语言2500单字v1.5.1
如果人和 AI 说同一种语言,文明会怎样?我用 2500 个单字试了试。2500个单字是不同领域、不同知识的共同体,无论你学编程或者是数学或写作,你都要用汉字,而常用的2500个汉字几乎可以涵盖不同行业做的不同事情。
Outlook Express 6 (OE6) for Win7/Win8/Win10
英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。
最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版
Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。
深挖C++:类和对象(中)
(先进后出)
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP
本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。
C++移动构造函数详解
移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。
ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL
Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
蓝桥杯报名正在火热进行(软件赛报名 2026-10-08—12-18,省赛 2027-04-10),电子学会 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名也已开启(9/23—12/2),全国青少年信息素养大赛算法应用主题赛同步推进——把 LCA 这个模板练熟,正是冲刺这些赛事树型考点的关键一步。所谓「最近公共祖先」:在一棵以某个节点为根的树里,两个节点 u、v 向上追溯,最早交汇的那个祖先就叫它们的 LCA。比如家谱里,你和你表哥最近的共同长辈就是你们的祖父。
【C语言】字符与字符串函数
C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。
C++ 多态详解:作用、原理与实战用法
多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。
C++ 函数模版
模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。
327



被折叠的 条评论
为什么被折叠?



