循环服务器TCP

服务器代码

/** ============================================================================================* 文件名称:server.c* 创建者: mf* 创建日期:2024年05月20日* 描述:此程序实现了一个简易的TCP服务器,监听8888端口,接受客户端连接后,每隔一秒向客户端发送当前时间,*       直到写入操作失败或客户端断开连接。服务器通过忽略SIGPIPE信号来处理潜在的管道错误。* ============================================================================================*/
#include <stdio.h>          // 标准输入输出定义
#include <sys/types.h>      // 基本系统数据类型定义
#include <sys/socket.h>     // 套接字编程相关函数声明
#include <netinet/in.h>     // 网络地址结构体定义
#include <netinet/ip.h>     // IP协议头文件
#include <arpa/inet.h>      // 地址转换函数声明
#include <unistd.h>         // 通用Unix函数声明,如close()
#include <signal.h>         // 信号处理函数声明
#include <time.h>           // 时间函数声明#define PORT 8888           // 监听端口号int main(int argc, char *argv[]) 
{int ret = -1;           // 返回值变量int sfd = -1;           // 服务器套接字描述符int cfd = -1;           // 客户端连接套接字描述符int opt = 1;            // 选项值,用于设置套接字选项// 创建TCP套接字sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd == -1) {perror("socket");   // 错误处理return -1;}// 设置套接字选项,允许端口重用ret = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if (ret == -1) {perror("setsockopt");return -1;}// 服务器地址结构体初始化struct sockaddr_in adds, addc;memset(&adds, 0, sizeof(adds));  // 清零adds.sin_family = AF_INET;       // 协议族为IPv4adds.sin_port = htons(PORT);     // 设置监听端口adds.sin_addr.s_addr = INADDR_ANY; // 监听所有IP地址// 绑定套接字到指定地址和端口ret = bind(sfd, (struct sockaddr*)&adds, sizeof(adds));if (ret == -1){perror("bind");return -1;}// 开始监听,最多挂起10个连接请求ret = listen(sfd, 10);if (ret == -1) {perror("listen");return -1;}// 忽略SIGPIPE信号,避免因写入已关闭的连接而退出signal(SIGPIPE, SIG_IGN);printf("等待客户端在端口 %d 上的连接...\n", PORT);// 循环等待并接受客户端连接while (1) {socklen_t addrlen = sizeof(addc);cfd = accept(sfd, (struct sockaddr*)&addc, &addrlen);if (cfd == -1) {perror("accept");continue; // 出错则继续等待下一个连接}// 打印客户端连接信息printf("连接来自 IP: %s 端口: %d\n", inet_ntoa(addc.sin_addr), ntohs(addc.sin_port));// 向客户端发送当前时间,每秒一次while (1) {time_t tm = time(NULL); // 获取当前时间sprintf(buf, "%s", ctime(&tm)); // 将时间转换为字符串ret = write(cfd, buf, strlen(buf)); // 发送给客户端if (ret == -1) {perror("write"); // 写入错误处理break; // 发生错误则跳出循环}sleep(1); // 暂停一秒}// 客户端连接结束,关闭连接套接字close(cfd);printf("客户端已断开连接。等待新连接...\n");}// 关闭服务器套接字,尽管这里可能永远不会执行到close(sfd);return 0;
}

客户端代码 

/** ============================================================================================* 文件名称:client.c* 创建者: mf* 创建日期:2024年05月20日* 描述:此程序实现了一个简易的TCP客户端,用于连接指定IP地址和端口的服务器(此处为192.168.110.6:8888),*       并不断从服务器接收数据,打印至标准输出。若连接失败或读取数据时发生错误,则程序将终止。* ============================================================================================*/
#include <stdio.h>          // 标准输入输出函数库
#include <sys/types.h>      // 基本系统数据类型定义
#include <sys/socket.h>     // 套接字编程所需函数声明
#include <netinet/in.h>     // 网络地址结构体定义
#include <arpa/inet.h>      // 地址转换函数声明
#include <unistd.h>         // 提供了POSIX操作系统API中的函数声明,如close()#define IP   "192.168.110.6" // 服务器IP地址
#define PORT 8888           // 服务器端口号int main(int argc, char *argv[]) 
{int fd = -1;           // 客户端套接字描述符int ret = -1;          // 函数返回值char buf[32] = {0};     // 用于接收服务器数据的缓冲区int opt = 1;           // 设置套接字选项的参数// 创建TCP套接字fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1){perror("socket");   // 错误处理return -1;}// 设置套接字选项,允许端口重用(注意:此选项在客户端通常不是必须的)ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if (ret == -1) {perror("setsockopt");return -1;}// 服务器地址结构体初始化struct sockaddr_in adds;memset(&adds, 0, sizeof(adds));  // 清零adds.sin_family = AF_INET;       // 协议族为IPv4adds.sin_port = htons(PORT);     // 设置服务器端口adds.sin_addr.s_addr = inet_addr(IP); // 设置服务器IP地址// 尝试连接服务器ret = connect(fd, (struct sockaddr*)&adds, sizeof(adds));if (ret == -1) {perror("connect");return -1;}// 连接成功,开始循环读取服务器发送的数据printf("已连接到服务器,开始接收数据...\n");while(1) {// 读取服务器发送的数据ret = read(fd, buf, sizeof(buf));if (ret == -1){perror("read");  // 读取错误处理return -1;} else if (ret == 0) {// 对端关闭连接,read返回0printf("服务器已关闭连接。\n");return -1;} else {// 打印接收到的数据printf("%s", buf);}}// 正常情况下不会执行到此处,但为了规范依然关闭套接字close(fd);return 0;
}

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

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

相关文章

VS Code添加高亮缩进功能

当代码缩进层次较多时&#xff0c;为了视觉上容易识别&#xff0c;一般希望可以多个缩进以不同颜色进行高亮显示&#xff0c; VS Code 中 indent-rainbow 插件可以实现这个功能。

蓝桥杯python组备赛指南

文章目录 前言刷题网站idle操作常用标准库mathdatetime 常见Q&A 前言 最近结束了比赛&#xff0c;我对比赛的过程进行了详细的复盘&#xff0c;并计划撰写一篇文章。这篇文章旨在为准备参加蓝桥杯的学弟学妹们提供帮助&#xff0c;我希望我的文章和笔记能对你们有所裨益。…

2024年150道高频Java面试题(七十二)

143. MyBatis 的工作原理是什么&#xff1f; MyBatis 是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它允许将对象与数据库中的记录相关联&#xff0c;同时保留对SQL语句的完全控制权。以下是MyBatis的工作原理&#xff1a; 配置SQL映射文件&#xff1a; …

TS中constructor使用public 、private 关键字

构造函数参数前的private关键字不是用于声明变量私有性的&#xff0c;而是与依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;相关。当你在构造函数参数中使用private关键字时&#xff0c;Angular会自动为你的组件或指令创建一个注入实例&#xff0c;并…

python列表生成式的魅力:轻松创建新列表

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 1. 列表生成式的基本结构 2. 列表生成式的进阶应用 3. 结合其他结构使用列表生成式 1. 列表…

HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;共有5个页面。 二、作品演示 三、代码目录 四、网站代码 HTML部分代…

校园招新之获取进QQ群但未报名人员

校园的社团、实验室招新一般由是校领导会发一个QQ通知&#xff0c;让各个班的同学们进一个招新群。 群里面会有负责人提示大家报名&#xff0c;但是群成员不总是都会报名&#xff0c;我们需要的就是&#xff0c;找到那些&#xff0c;已经进群&#xff0c;但是没有报名的同学&am…

ELK 日志监控平台(一)- 快速搭建

文章目录 ELK 日志监控平台&#xff08;一&#xff09;- 快速搭建1.ELK 简介2.Elasticsearch安装部署3.Logstash安装部署4.Kibana安装部署5.日志收集DEMO5.1.创建SpringBoot应用依赖导入日志配置文件 logback.xml启动类目录结构启动项目 5.2.创建Logstash配置文件5.3.重新启动L…

当HR问你是否单身时,该怎么回答?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我是晶圆厂厂务工程师&#xff0c;最近在面试新工作&#xff0c;但是几乎每家HR都会问我同一个问题&#xff1a;你结婚没有&#xff1…

解密Spring Boot Starter与自动配置:探秘神奇的背后

starter可以理解为Spring Boot中的一站式集成启动器&#xff0c;包含了一系列可以集成到应用中的依赖项&#xff0c;可以快递集成spring组件及其框架&#xff0c;而不需要到处找示例代码。 一、为什么要用starter&#xff1f; 在springboot还没有出来之前&#xff0c;我们使用…

wps使用(解决毕业论文)

目录自动生成 页码自动生成 一部分使用I II III IV 格式&#xff0c;一部分使用1&#xff0c;2&#xff0c;3&#xff0c;4 格式 先设置全部文章为I II III IV 格式&#xff0c;然后再需要的地方再设置1&#xff0c;2&#xff0c;3&#xff0c;4 格式 一键设置中文、英文、数…

2024年全国大学生电工数学建模竞赛B题解析 | 数据处理 代码 论文分享

B 题&#xff1a;大学生平衡膳食食谱的优化设计及评价 1 数据预处理2 问题一2.1 问题1.12.1.1 评价体系的构建2.1.2 指标计算2.1.3 指标计算结果2.1.4 基于层次分析法的膳食营养评价模型2.1.5 评价模型的求解 2.2 问题1.22.2.1 食物与成分间拓扑关系的构建2.2.2 微调模型的建立…

【SpringBoot】整合百度文字识别

流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别&#xff0c;立即使用 1.4 根据自己需要&#xff0c;选择要开通的项目 二、代码编写 以通用文字识别&#xff08;高精度版&am…

C# PipStream流的详解与示例

文章目录 PipStream概述PipStream的创建方法PipStream的播放方法PipStream的暂停方法PipStream的删除方法示例代码总结 本文将详细介绍C#中的PipStream流&#xff0c;包括其概述、创建方法、播放方法、暂停方法以及删除方法。通过示例代码&#xff0c;帮助读者更好地理解和掌握…

蚁小二:又一款高效自媒体工具,免费用户可发5个账号

其实自媒体的群发工具有几个&#xff0c;除了前几天介绍的融媒宝还有蚁小二等。因为融媒宝免费用户只能添加5个账号&#xff0c;所以不够用的朋友可以再下载蚁小二使用&#xff0c;这样就有10个账号可以发布了&#xff1a; 蚁小二简介 蚁小二是由长沙草儿绽放科技有限公司自主…

mysql - 索引原理

mysql索引原理 文中的查询, 以该表结构为例 CREATE TABLE user (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,sex tinyint(1) NOT NULL COMMENT 性别,phone varchar(255) CHARACTER SET utf8mb4…

设计模式9——适配器模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式&#xff08;Adapte…

酷开科技以内容为契机,酷开系统向消费者需求的深度挖掘迈进一步

酷开系统还拥有强大的内容资源和推荐算法&#xff0c;能够根据消费者的兴趣爱好为其提供个性化的推荐服务。无论是电影、电视剧、综艺节目&#xff0c;还是新闻、体育、娱乐资讯&#xff0c;酷开系统都能帮助大家快速找到感兴趣的内容&#xff0c;并且通过智能推荐算法不断优化…

(南京观海微电子)——TFT LCM的作用

VCOM介绍 VCOM是液晶分子偏转的参考电压 &#xff0c;要求要稳定&#xff0c;对液晶显示有直接影响&#xff0c;具体的屏不同的话 也是不同的。 电压的具体值是根据输入的数据以及Vcom电压大小来确定的&#xff0c;用来显示各种不同灰阶&#xff0c;也就是实现彩色显示GAMMA简…

YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)

前言 Hello大家好&#xff0c;我是Snu77&#xff0c;继YOLOv9发布时间没有多久&#xff0c;YOLOv10就紧接着发布于2024.5.23号&#xff08;不得不感叹YOLO系列的发展速度&#xff0c;但要纠正大家的观点就是不是最新的就一定最好&#xff09;&#xff01; 本文给大家带来的是…