C语言再学习 -- C语言搭建TCP服务器/客户端
TCP/UDP讲过~
参看:UNIX再学习 – TCP/UDP 客户机/服务器
这里记录一下可用的TCP服务器和客户端代码。
参看:用C语言搭建TCP服务器/客户端
一、TCP服务器
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>//分别打印错误信息,函数名和行号到标准错误流中
#define ERR_MSG(msg) do{\fprintf(stderr,"__%s__ __%s__ __%d__",__FILE__,__func__,__LINE__);\perror(msg);\
}while(0)//循环只是为了去括号,无任何意义#define IP "000.000.000.000" //ifconfig,ip根据自己的去设置int main(int argc, char const *argv[])
{//创建流式套接字int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sock success sfd=%d\n",sfd);//允许端口快速被覆盖重用。int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1; }printf("允许端口快速被覆盖重用成功\n");//填充地址信息结构体,真实的地址信息结构体AF_INET:man 7 IPstruct sockaddr_in sin;//定义结构体变量,引出成员并填充地址sin.sin_family = AF_INET; //这里填ipv4协议sin.sin_port = htons(6666);//端口号的网络字节序1024~49151,将端口号转换成网络字节序sin.sin_addr.s_addr = inet_addr(IP);//将ip地址的点分十进制转换成网络字节序,并存到sin下的sin_addr下的s_addr中//绑定服务器的地址信息//bind函数可以绑定地址信息到套接字文件中,参数分别是//指定要绑定到那个套接字上,填对应的文件描述符//通用地址结构体,真实的地址信息结构体根据地址族制定,绑定IP和端口号到服务器套接字上//真实的地址信息结构体的大小if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0){//将sin中得地址信息绑定到sfd套接字文件中(因为sin的变量类型不一样//需要强制类型转换),最后可以使用sizeof直接算出sin结构体变量的大小ERR_MSG("bind");return -1;}printf("bind success __%d__\n",__LINE__);//输出当前行号//将套接字设置为被动监听状态if(listen(sfd,128) < 0){//将sfd套接字设置为被监听状态,允许同时有128个客户端未完成链接ERR_MSG("listen");return -1;}printf("listen success __%d__\n",__LINE__);//链接成功后输出行号struct sockaddr_in cin;//存储客户端信息,定义存储地址信息结构体变量socklen_t addrlen = sizeof(cin);//定义结构体类型存取结构体长度//超时检测//struct timeval tm = {60,0};//if(setsockopt(sfd,SOL_SOCKET,SO_RCVTIMEO,&tm,sizeof(tm)));//生成新的文件描述符与客户端通信int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);//定义整形变量,接收accept函数的返回值,从以完成的链接的sfd队列中获取一个客户端的//信息,生成一个新的cin文件描述符,该文件描述符是通信使用的文件描述副if(newfd < 0){if(11 == errno){printf("time out...\n");return -1;}ERR_MSG("accept");return -1;}printf("[%s:%d] newfd=%d 客户端链接成功 __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);//客户端链接成功后输出,转换后的ip地址和转换后的主机字节序,和行号char buf[128] = "";//定义字符型数组存取数据ssize_t res = 0;//定义结构提变量接收返回值while(1){bzero(buf,sizeof(buf));//将buf数组清零//接收res = recv(newfd,buf,sizeof(buf),0);//从得到accept返回值的newfd套接字中//接收缓冲区的数据,并存储在数组中,用sizeof算出指定读取字节最后用0表示以阻塞方式//读取if(res <0)//返回值小于0,读取失败{ERR_MSG("recv");return -1;}else if(0 == res)//返回值等于0,客户端下线{printf("[%s:%d] newfd=%d 客户端下线__%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,__LINE__);//输出转换后的ip地址和主机字节序,和新的文件描述符break;}printf("[%s:%d] newfd=%d : %s __%d__\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf,__LINE__);//输出ip地址和主机字节序,新的文件描述符和buf中的内容//发送strcat(buf,"*_*");//在buf数组的末尾追加*_*,证明服务器以收到数据if(send(newfd,buf,sizeof(buf),0) < 0)//如果返回值小于0,发送失败{//send函数可以将but数组中的数据发送给accept函数中得到的文件描述符,//第三项是大小,第四项0是阻塞发送ERR_MSG("send");return -1;}printf("send success __%d__\n",__LINE__);//发送成功后显示数据}//关闭if(close(newfd) < 0)//关闭newfd套接字{ERR_MSG("close");//关闭失败返回-1,并输出错误内容return -1;}if(close(sfd) < 0)//关闭sfd套接字{ERR_MSG("close");return -1;}return 0;
}
二、TCP客户端
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#define ERR_MSG(msg) do{\fprintf(stderr,"__%s__ __%s__ __%d__",__FILE__,__func__,__LINE__);\perror(msg);\
}while(0)#define IP "000.000.000.000" //ip地址根据自己的去设置
#define PORT 6666 //端口号 1024~49151int main(int argc, char const *argv[])
{//创建流式套接字int cfd = socket(AF_INET,SOCK_STREAM,0);//定义整形变量接收socket函数返回的文件描述副if(cfd < 0){ERR_MSG("socket");return -1;}printf("create socket success cfd=%d __%d__\n",cfd,__LINE__);//绑定客户端自身的地址信息结构体---》非必须绑定//若客户端没有绑定地址信息,//测操作系统会自动帮客户端绑定本机IP,以及49151~65535内的随机端口//填充服务器的地址信息结构体,给connect函数使用//要链接哪个服务器,就填哪个服务器的地址信息struct sockaddr_in sin;sin.sin_family = AF_INET; //这里填ipv4协议sin.sin_port = htons(PORT);//端口号的网络字节序1024~49151,将端口号转换成网络字节序sin.sin_addr.s_addr = inet_addr(IP);//将ip地址的点分十进制转换成网络字节序,并存到sin下的sin_addr下的s_addr中//链接服务器if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin)) < 0)//当返回值小于0,失败{//通过connect函数链接服务器:将指定要链接的文件描述符绑定sin的结构体变量链接服务器,ERR_MSG("connect");return -1;}printf("connect success __%d__\n",__LINE__);//成功后返回行号char buf[128] = "";//定义字符型数组ssize_t res = 0;//定义结构体变量,接收返回值while(1){//从终端获取数据printf("请输入>>> ");fgets(buf,sizeof(buf),stdin);//从标准输入流中读取数据,存入到buf数组中buf[strlen(buf)-1] = 0;//将buf的最后一位‘\n’改为0//发送if(send(cfd,buf,sizeof(buf),0) < 0)//返回值小于0,发送失败{//通过cfd套接字文件描述符向缓冲区发送buf中的数据ERR_MSG("send");return -1;}printf("send success __%d__\n",__LINE__);//成功输出行号//接收bzero(buf,sizeof(buf));//将buf数组清零res = recv(cfd,buf,sizeof(buf),0);//通过该函数从该套接字文件描述符中接收数据,并存入buf数组中if(res < 0)//如果返回值小于0{ERR_MSG("recv");//接收失败return -1;}else if(0 == res)//返回之等于0,断线{printf("服务器离线\n");break;}printf("%s __%d__\n",buf,__LINE__);//接收成功输出buf数组中的内容和行号}//关闭if(close(cfd) < 0)//关闭cfd套接字文件描述符{ERR_MSG("close");return -1;}return 0;
}
相关文章:
C语言再学习 -- C语言搭建TCP服务器/客户端
TCP/UDP讲过~ 参看:UNIX再学习 – TCP/UDP 客户机/服务器 这里记录一下可用的TCP服务器和客户端代码。 参看:用C语言搭建TCP服务器/客户端 一、TCP服务器 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #inc…...
企业远程控制如何保障安全?向日葵“全流程安全远控闭环”解析
远程控制为企业带来的便利与业务上的赋能是显而易见的,但很多企业依然对广泛的使用远程控制持一个观望的态度,其中最主要的原因,就是安全。 由于远程控制的原理和特性,它天然地会成为一个企业信息安全敏感领域,企业在…...
为什么需要放行回源IP
为什么需要放行回源IP 网站以“独享模式”成功接入WAF后,所有网站访问请求将先经过独享引擎配置的ELB然后流转到独享引擎实例进行监控,经独享引擎实例过滤后再返回到源站服务器,流量经独享引擎实例返回源站的过程称为回源。在服务器看来&…...
2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②
2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段:职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段:安全运营项目1. 操作系统安全配置与加…...
C语言:预处理详解
创作不易,来个三连呗! 一、预定义符号 C语⾔设置了⼀些预定义符号,可以直接使⽤,预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编…...
一区优化直接写:KOA-CNN-BiLSTM-Attention开普勒优化卷积、长短期记忆网络融合注意力机制的多变量回归预测程序!
适用平台:Matlab 2023版及以上 KOA开普勒优化算法,于2023年5月发表在SCI、中科院1区Top顶级期刊《Knowledge-Based Systems》上。 该算法提出时间很短,目前还没有套用这个算法的文献。 同样的,我们利用该新鲜出炉的算法对我们的…...
高防IP如何有效应对网站DDOS攻击
高防IP如何有效应对网站DDOS攻击?随着互联网的发展,网站安全问题变得越来越重要。DDoS攻击作为一种常见的网络攻击方式,给网站的稳定性和可用性带来了巨大威胁。而高防IP作为一种专业的网络安全解决方案,能够有效地应对DDoS攻击&a…...
1.6 面试经典150题 - 跳跃游戏
跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 class Solution…...
Apache安全及优化
配置第一台虚拟机 VM1网卡 yum仓库 挂载磁盘 上传3个软件包到/目录 到/目录下进行解压缩 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar -xjf httpd-2.4.29.tar.bz2 mv apr-1.6.2 httpd-2.4.29/srclib/apr mv apr-util-1.6…...
【话题】边缘计算的挑战和机遇
边缘计算是一种新的计算范式,其核心是在网络边缘处理数据,而不是传统的中心式云计算模式。这种计算方式的兴起得益于物联网(IoT)的普及和丰富的云服务的成功。 机遇: 响应时间优化:由于数据处理更接近数据…...
react之unpkg.com前端资源加载慢、加载不出
文章目录 react之unpkg.com前端资源加载慢什么是unpkg.com加载慢原因解决方案替换国内cdn在 package.json 中打包进来 react之unpkg.com前端资源加载慢 什么是unpkg.com unpkg 是一个内容源自 npm 的全球快速 CDN。 作为前端开发者,我们对 unpkg 都不陌生&#x…...
C++类与对象【对象模型和this指针】
🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🎄1 C对象模型和this指针🌶️1.1 成员变量和成员函数分开存储🌶️1.2 this指针概念🌶️1.3 空指针访问成员函数🌶…...
策略模式在工作中的运用
前言 在不同的场景下,执行不同的业务逻辑,在日常工作中是很寻常的事情。比如,订阅系统。在收到阿里云的回调事件、与收到AWS的回调事件,无论是收到的参数,还是执行的逻辑都可能是不同的。为了避免,每次新增…...
【go】依赖倒置demo
文章目录 前言1 项目目录结构:2 初始化函数3 router4 api5 service6 dao7 Reference 前言 为降低代码耦合性,采用依赖注入的设计模式。原始请求路径:router -> api -> service -> dao。请求的为实际方法,具有层层依赖的…...
C++ //练习 2.5 指出下述字面值的数据类型并说明每一组内几种字面值的区别:
C Primer(第5版) 练习 2.5 练习 2.5 指出下述字面值的数据类型并说明每一组内几种字面值的区别: ( a ) ‘a’, L’a’, “a”, L"a" ( b ) 10, 10u, 10L, 10uL, 012, 0xC ( c ) 3.14, 3.14f, 3.14L ( d ) 10, 10u, 10., 10e-2…...
必示科技助力中国联通智网创新中心通过智能化运维(AIOps)通用能力成熟度3级评估
2023年12月15日,中国信息通信研究院隆重公布了智能化运维AIOps系列标准最新批次评估结果。 必示科技与中国联通智网创新中心合作的“智能IT故障监控定位分析能力建设项目”通过了中国信息通信研究院开展的《智能化运维能力成熟度系列标准 第1部分:通用能…...
python数字图像处理基础(九)——特征匹配
目录 蛮力匹配(ORB匹配)RANSAC算法全景图像拼接 蛮力匹配(ORB匹配) Brute-Force匹配非常简单,首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试&#x…...
k8s的对外服务ingress
1、service的作用体现在两个方面 (1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制 (2)集群外部:类似于负载均衡器ÿ…...
[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05-3+4
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05-34 3. Step by step : Deriation of Kalmen Gain 卡尔曼增益/因数 详细推导4. Priori/Posterrori error Covariance Martix 误差协方差矩阵 3. Step by step :…...
关于前端面试中forEach方法的灵魂7问?
目录 前言 一、forEach方法支持处理异步函数吗? 二、forEach方法在循环过程中能中断吗? 三、forEach 在删除自己的元素后能重置索引吗? 四、forEach 的性能相比for循环哪个好? 五、使用 forEach 会不会改变原来的数组&#…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
