C++ socket编程(1)
这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。
Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。
服务器会等待连接,客户端连接后,服务发送"connected."给客户端。
然后客户端会与服务器进行10次交互,一个交互为:客户端发一个消息,服务器收到,原样返回给客户端,客户端收到,再发下一个消息。
10次交互完成,关闭链接,两边程序都结束。
服务器程序:
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>#pragma comment (lib, "ws2_32.lib")#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234int main()
{WSADATA wsaData;WSAStartup( MAKEWORD(2, 2), &wsaData);SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);struct sockaddr_in sockAddr;memset(&sockAddr, 0, sizeof(sockAddr));sockAddr.sin_family = PF_INET;inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);sockAddr.sin_port = htons(SOCKET_PORT);bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));listen(servSock, 1);SOCKADDR clntAddr;int nSize = sizeof(SOCKADDR);SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);const char *str = "connected.";send(clntSock, str, strlen(str)+sizeof(char), NULL);int i = 10;char szBuffer[MAXBYTE] = { 0 };while (i != 0){memset(szBuffer, 0, MAXBYTE);recv(clntSock, szBuffer, MAXBYTE, NULL);std::cout << szBuffer << std::endl;send(clntSock, szBuffer, strlen(szBuffer)+ sizeof(char), NULL);--i;}closesocket(clntSock);closesocket(servSock);WSACleanup();return 0;
}
客户端程序:
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32.lib")#define SOCKET_ADDR "127.0.0.1"
#define SOCKET_PORT 1234int main()
{WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);struct sockaddr_in sockAddr;sockAddr.sin_family = PF_INET;inet_pton(AF_INET, SOCKET_ADDR, &sockAddr.sin_addr.s_addr);sockAddr.sin_port = htons(SOCKET_PORT );connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));char szBuffer[MAXBYTE] = {0};recv(sock, szBuffer, MAXBYTE, NULL);std::cout << szBuffer << std::endl;int i = 10;while (i != 0){snprintf(szBuffer, MAXBYTE, "Index:%d", i);send(sock, szBuffer, strlen(szBuffer) + sizeof(char), NULL);std::cout << "send:" << szBuffer << std::endl;memset(szBuffer, 0, MAXBYTE);recv(sock, szBuffer, MAXBYTE, NULL);std::cout << "recv:" << szBuffer <<std::endl;--i;}closesocket(sock);WSACleanup();return 0;
}
客户端运行后输出:
connected.
send:Index:10
recy:Index:10
send:Index:9
recy:Index:9
send:Index:8
recy:Index:8
send:Index:7
recy:Index:7
send:Index:6
recy:Index:6
send:Index:5
recy:Index:5
send:Index:4
recy:Index:4
send:Index:3
recy:Index:3
send:Index:2
recy:Index:2
send:Index:1
recy:Index:1
两个程序在VS2019上编译运行通过。
主要交互在while里, 客户端这边是(发,收),服务器这边是(收, 发)。
Linux的socket与Windows类似,区别如下:
1.socket类型不同,
Windows: SOCKET(unsigned __int64)
Linux: int
2.收发函数不同:
Windows: recv/send
Linux: read/write
3.关闭socket不同:
Windows: closesocket(socket)
Linux: close(socket)
相关文章:
C++ socket编程(1)
这里是一个socket编程Demo,不考虑出错情况,代码简单,便于了解socket流程。 Demo分为服务器程序和客户端程序,运行需要先启动服务器程序,再启动客户端程序。 服务器会等待连接,客户端连接后,服…...
C# 文件夹类的实现与文件属性处理
在现代软件开发中,处理文件和文件夹是非常常见的任务。 C# 提供了丰富的类库来操作这些文件系统的基本元素。本篇文章将探讨如何在 C# 中实现一个简单的文件夹类,以及如何获取文件名、文件路径、大小和创建日期等文件属性。 一、使用 System.IO 命…...
基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
【论文笔记】DKTNet: Dual-Key Transformer Network for small object detection
【引用格式】:Xu S, Gu J, Hua Y, et al. Dktnet: dual-key transformer network for small object detection[J]. Neurocomputing, 2023, 525: 29-41. 【网址】:https://cczuyiliu.github.io/pdf/DKTNet%20Dual-Key%20Transformer%20Network%20for%20s…...
设计模式之适配器模式(Adapter)
一、适配器模式介绍 适配器模式(adapter pattern )的原始定义是:将类的接口转换为客户期望的另一个接口, 适配器可以让不兼容的两个类一起协同工作。 适配器模式是用来做适配,它将不兼容的接口转换为可兼容的接口,让原本由于接口…...
[git] github管理项目之环境依赖管理
导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch,需要添加源!! pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.html想到一个麻烦的…...
【STM32 Blue Pill编程实例】-SD卡文件读写(SPI接口)
SD卡文件读写(SPI接口) 文章目录 SD卡文件读写(SPI接口)1、SD卡模块介绍2、硬件准备与接线3、模块配置3.1 SPI接口配置3.2 SPI接口的片选信号引脚配置3.3 FATFS配置4、代码实现在本文中,我们将介绍如何将 microSD 卡与 STM32 Blue Pill 连接,并在STM32CubeIDE中对SD卡进行…...
为什么需要软件测试?
软件测试 软件测试是评估和验证计算机程序或系统是否按预期运行的过程。 它涉及执行程序或系统以识别预期结果和实际结果之间的任何错误或差距。 目标是确保软件满足指定的要求,没有缺陷,并在不同场景中可靠地工作。 为什么需要软件测试?…...
成为超人:普通人如何白手起家,富一代和富二代的根本区别是什么?
成为超人:普通人如何白手起家,富一代和富二代的根本区别是什么? 我的问题是事业就讲 10 年装逼学习法失效① 光说不练,还是太懒真正的勤奋,解决温饱后,只专注赚钱这件事 ② 信念飘摇,随波流转万…...
Java 集合 Collection常考面试题
理解集合体系图 collection中 list 是有序的,set 是无序的 什么是迭代器 主要遍历 Collection 集合中的元素,所有实现了 Collection 的集合类都有一个iterator()方法,可以返回一个 iterator 的迭代器。 ArrayList 和 Vector 的区别? ArrayList 可以存放 null,底层是由数…...
C++继承与菱形继承(一文了解全部继承相关基础知识和面试点!)
目的减少重复代码冗余 Class 子类(派生类) : 继承方式 父类(基类) 继承方式共有三种:公共、保护、私有 父类的私有成员private无论哪种继承方式都不可以被子类使用 保护protected权限的内容在类内是可以访问,但是在…...
谷歌DeepMind 德米斯·哈萨比斯 因蛋白质预测AI荣获诺贝尔化学奖
2024年诺贝尔化学奖的一半授予了谷歌DeepMind的联合创始人兼首席执行官德米斯哈萨比斯和公司总监约翰M朱姆珀,以表彰他们在利用人工智能预测蛋白质结构方面的研究成果。另一半奖项则授予华盛顿大学生物化学教授大卫贝克,以表彰他在计算蛋白质设计领域的贡…...
内网笔记大全
内网笔记大全 1、基础命令 Windows 1、net user #查看用户 2、net view #查看在线主机 3、systeminfo #查看操作系统的基本配置 4、ipconfig /all #详细显示当前网络配置信息和网卡信息 5、net localgroup #查看本地组信息 6、net localgroup administrators #查看管理员组 7、…...
peft.LoraConfig()参数说明
LoraConfig()介绍 LoraConfig()是peft库中的一个配置类,用于设置大模型微调方法LoRA(Low-Rank Adaptation)的相关参数。PEFT 库为各种参数高效的微调方法(如 LoRA)提供了封装,以减少微调大模型时的计算资源…...
串口(UART)的FPGA设计(接收与发送模块)
目录 串口基础知识 一、什么是串口?有哪些特点? 二、常见的串口通信协议有哪些?他们有什么区别?...
JSON 格式化工具:快速便捷地格式化和查看 JSON 数据
JSON 格式化工具:快速便捷地格式化和查看 JSON 数据 为什么需要 JSON 格式化工具? 在日常开发和调试中,JSON 是非常常见的数据交换格式。无论是前端与后端的接口调用,还是数据存储和处理,JSON 格式都扮演着重要角色。…...
【星汇极客】STM32 HAL库各种模块开发之1.8TFT屏幕
前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…...
Excel中使用SQL语句的四种方法
总结在 Excel 中使用 SQL 语句的四种方法,各种方法都有各自的适用场景,可以选择自己熟悉的或喜欢方式。本文以在 Excel 中操作 MS SQL 数据库的数据为例进行说明。MS SQL 的数据如下,使用微软 SQLExpress 版本。 方法 1: Excel 现…...
目标检测中的损失函数
损失函数是用来衡量模型与数据的匹配程度的,也是模型权重更新的基础。计算损失产生模型权重的梯度,随后通过反向传播算法,模型权重得以更新进而更好地适应数据。一般情况下,目标损失函数包含两部分损失,一个是目标框分…...
list库实现
list库实现的要点: 构建list类时,需要同时构建struct Node来存储节点信息,list类中只存储哨兵位节点信息,迭代器类需要template<T,Ptr,Ref>来构建const和非const迭代器,迭代器中也是存储节点信息。反向迭代器也…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
