实现基于TCP协议的服务器与客户机间简单通信
服务器端程序
#include <myhead.h>
#define SER_PORT 6666 //服务器端口号
#define SER_IP "192.168.2.53" //服务器ip地址
int main(int argc, char const *argv[])
{
/*创建套接字
int socket(int domain, int type, int protocol);*/
int sfd = socket(AF_INET, SOCK_STREAM, 0);
//ipv4,TCP协议,默认0
if (sfd == -1)
{
perror("socket error");
return -1;
}
printf("套接字创建成功,sfd = %d\n", sfd);
//端口快速重用
int refuse = 1;
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &refuse, sizeof(refuse)) == -1)
{
perror("setsockopt error");
return -1;
}
printf("端口快速重用成功,sfd = %d\n", sfd);
//为套接字绑定IP地址和端口号
struct sockaddr_in sin; //地址信息结构体
sin.sin_family = AF_INET; //通信域
sin.sin_port = htons(SER_PORT); //端口号
sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址
//绑定工作
if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1)
//套接字名,地址信息结构体,结构体大小
{
perror("bind error");
return -1;
}
printf("bind success\n");
//将套接字设置为被动监听状态
if (listen(sfd, 128) == -1)
//套接字描述符,容纳连接的队列的最大长度,一般填128
{
perror("listen error");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin; //用于接受地址信息
socklen_t addrlen = sizeof(cin); //用于接收长度
//阻塞等待客户端连接请求
int newfd = accept(sfd, (struct sockaddr *)&cin, &addrlen);
//套接字,接收对端地址信息结构体的指针,接收对端地址信息的长度
if (newfd == -1)
{
perror("accept error");
return -1;
}
printf("[%s,%d]已成功连接一个客户端\n",
inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
//数据收发
char buf[128];
while (1)
{
//清空容器
bzero(buf, sizeof(buf));
//接收套接字数据
int res = recv(newfd, buf, sizeof(buf), 0);
/*
参数1: 用于通信的套接字文件描述符
参数2:接收数据后的容器地址
参数3:接收的数据的大小
参数4:是否阻塞接收*/
if (res == -1)
{
perror("recv error");
return -1;
}
else if (res == 0)
{
printf("客户端已经下线\n");
close(newfd); //关闭客户端套接字
break;
}
//正常收到发来的信息
printf("[%s:%d]:%s\n",
inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);
//操作消息
strcat(buf, "*v*");
//将消息回复给客户端
if (send(newfd, buf, strlen(buf), 0) == -1)
/*
参数1:通信的套接字文件描述符
参数2:要发送数据的起始地址
参数3:要发送数据的大小
参数4:是否阻塞接收*/
{
perror("send error");
return -1;
}
printf("发送成功\n");
}
//关闭监听
close(sfd);
return 0;
}
客户机端程序
#include <myhead.h>#define SER_PORT 6666 //与服务器保持一致
#define SER_IP "192.168.0.130" //服务器ip地址
#define CLI_PORT 8888 //客户端端口号
#define CLI_IP "192.168.0.130" //客户端ip地址int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);//2、绑定IP地址和端口号//2.1 填充地址信息结构体struct sockaddr_in cin;cin.sin_family = AF_INET; //通信域cin.sin_port = htons(CLI_PORT); //端口号cin.sin_addr.s_addr = inet_addr(CLI_IP); //ip地址//2.2 绑定工作if (bind(cfd, (struct sockaddr *)&cin, sizeof(cin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、连接到服务器//3.1 填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域sin.sin_port = htons(SER_PORT); //服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //服务器ip地址//3.2 连接服务器if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");//4、数据收发char buf[128] = "";while (1){printf("请输入>>>");fgets(buf, sizeof(buf), stdin); //从终端获取一个字符串buf[strlen(buf) - 1] = 0;//将数据发送给服务器send(cfd, buf, strlen(buf), 0);printf("发送成功\n");//接受服务器发来的数据//清空容器bzero(buf, sizeof(buf));recv(cfd, buf, sizeof(buf), 0);printf("收到服务器消息为:%s\n", buf);}//5、关闭套接字close(cfd);return 0;
}
相关文章:
实现基于TCP协议的服务器与客户机间简单通信
服务器端程序 #include <myhead.h> #define SER_PORT 6666 //服务器端口号 #define SER_IP "192.168.2.53" //服务器ip地址 int main(int argc, char const *argv[]) { /*创建套接字 int socket(int domain, int type, int protocol);*/ …...
在uniapp中使用navigator.MediaDevices.getUserMedia()拍照并上传服务器
产品提了这样一个需求: 移动端拍照上传后图片不保存在用户设备上,试了好几种方法,uni-file-picker、uni.chooseImage、input type‘file’,安卓手机都会默认把图片保存在手机,于是各种查资料,找到了以下方法…...
PULLUP
重要提示:PULLUP属性已被弃用,应替换为PULLTYPE 财产。 PULLUP在三态输出或双向端口上应用弱逻辑高,以防止 它从漂浮。PULLUP属性保证逻辑高电平,以允许三态网络 以避免在不被驱动时漂浮。 输入缓冲器(如IBUFÿ…...
【无标题】乐天HIQ壁挂炉使用
这里写自定义目录标题 1.按键①: 按一下,小液晶显示的温度是所设定的供暖温度; 按二下,小液晶显示的温度是所设定的生活热水温度; 按三下,小液晶显示的温度是所设定的室内温度; 如果忘记按几下的…...
使用Python编写AI程序,让机器变得更智能
人工智能(AI)是当今科技领域最热门的话题之一。随着Python编程语言的逐渐流行,它已经成为许多人工智能编程的首选语言。本文将介绍如何使用Python编写AI程序,让机器变得更智能。 首先,Python提供了大量的AI库和工具&a…...
VScode + PlatformIO 和 Keil 开发 STM32
以前经常使用 KEIL 写 STM32 的代码,自从使用 VScode 写 ESP32 后感觉 KEIL 的开发环境不美观不智能了,后面学习了 VScode 开发 STM32 。 使用过程中发现 串口重定向在 KEIL 中可以用,搬到 VScode 后不能用,不用勾选 Use Micro LI…...
PostgreSQL 练习 ---- psql 新增连接参数
目标 添加一个连接参数,默认为 false 。当 psql 连接时,若该连接参数非 “true” 时,用户 “u1“ 对表对象无操作权限,包括自己拥有的表。 连接机制简介 连接过程如下所述: 客户端初始化一个空连接,设置…...
pdf翻译软件哪个好用?多语言轻松转
想知道怎么用pdf翻译器在线翻译吗?无需复杂操作,一键即可解锁语言障碍。 在这个全球化日益加深的时代,掌握pdf文件的快速翻译技巧尤为重要。 无论是学习、工作还是国际交流,以下4个免费pdf翻译技巧都将是你不可或缺的得力助手。…...
培训第三十天(ansible模块的使用)
上午 ansible是⼀种由Python开发的⾃动化运维⼯具,集合了众多运维⼯ 具(puppet、cfengine、chef、func、fabric)的优点,实现了批量 系统配置、批量程序部署、批量运⾏命令等功能。 1、学习ansible的使用 ansible 主机ip|域名|组…...
关于Log4net的使用记录——无法生成日志文件输出
关于Log4net的使用记录 前言遇到的问题具体使用总结前言 最近在使用log4net进行日志记录,保存一些需要的数据,以便后期使用需要。在使用的时候出现没有生成日志文件,针对这些问题,发现解决的办法! 遇到的问题 报错,提示没有找到对应的文件。 log4net:ERROR Failed to f…...
golang Kratos 概念
"Kratos"指的是一个开源的微服务框架,它用于构建高性能和可扩展的云原生应用。Kratos框架提供了一套丰富的工具和库,旨在简化微服务的开发和维护。下面是Kratos框架的一些基本概念: 服务构建与注册: gRPC与HTTP服务&…...
入门 MySQL 数据库:基础指南
简介 MySQL 是一个非常流行的开源关系型数据库管理系统(RDBMS),广泛用于 Web 应用、企业应用和数据仓库。本博客将引导你从零开始,学习 MySQL 数据库的基础知识。 什么是 MySQL? MySQL 是一个基于 SQL(Str…...
【Hexo系列】【3】使用GitHub自带的自定义域名解析
上一期我们通过学习【Hexo系列】【2】使用Vercel加速Hexo博客访问使用Vercel进行GitHub同步与加速,有时候Vercel也不太稳定访问不了。本身GitHub也是支持自定义域名的,本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitH…...
智能监控,无忧仓储:EasyCVR视频汇聚+AI智能分享技术为药品仓库安全保驾护航
随着科技的飞速发展,药品仓库的安全管理正迎来前所未有的变革。药品作为直接关系到公众健康的重要物资,其安全存储和监管显得尤为重要。在这个背景下,视频汇聚平台EasyCVR视频智能管理系统的应用,为药品仓库的安全监管提供了强有力…...
本地创建PyPI镜像
背景: 在安装一些库时,经常需要反复下载包(有的体积比较大,所以会比较慢),所以考虑在本地创建一个pypi镜像,把常用的库缓存下来,这样安装就会很省事.比较从本地安装库和从服务器下载会快很多. 安装使用 安装:pip install devpi 初始化: devpi-init --serverdirF:\pypioutput…...
使用 Elasticsearch RestHighLevelClient 进行查询
Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…...
【jvm】符号引用
目录 1. 说明2. 特点3. 组成与格式4. 作用5. 过程 1. 说明 1.在Java虚拟机中,符号引用(Symbolic Reference)是一种重要的引用机制。2.它主要用于在编译阶段和类加载阶段之间建立对类、方法、字段等元素的引用关系。3.符号引用是指用一个符号…...
征服云端:Java微服务与Docker容器化之旅
引言 随着云计算技术的迅猛发展,越来越多的企业开始拥抱云原生技术。在这个过程中,微服务架构以其独特的魅力成为了众多开发者的首选方案。而Docker作为容器化领域的佼佼者,在微服务部署与管理方面扮演着不可或缺的角色。本文将带你深入了解…...
python 如何实现执行selenium自动化测试用例自动录屏?
做自动化测试已经好多年了,随着项目技术的正增长提升,我们也不断完善并提高自己的技术能力, 下面给大家分享一个 selenium 自动化执行测试用例的录屏功能。希望对大家有帮助! 首先,我们为什么要执行自动化录屏功能呢…...
03 网络编程 TCP传输控制协议
目录 1、TCP基本特征 2、TCP通信流程基本原理 (1)基本原理 (2)TCP通信代码实现 (3)核心API解析 1)地址绑定--bind 2)设置监听-listen 3)等待连接请求-accept-产生一个已连接套接字 4&a…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
