C++ socket编程(TCP)
服务端保持监听客户端, 服务端采用select实现,可以监听多个客户端
客户端源码
在这里插入代码片
```#include <iostream>
//#include <windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
using namespace std;
#pragma comment(lib, "Ws2_32.lib")int main() {WSADATA wd;int result;result = WSAStartup(MAKEWORD(2, 2), &wd);if (result != 0) {cout << "WSAStartup error" << endl;return 0;}//创建套接字SOCKET c_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (c_socket == INVALID_SOCKET) {cout << "socket error" << endl;return 0;}sockaddr_in c_addr;inet_pton(AF_INET, "127.0.0.1", &c_addr.sin_addr.S_un.S_addr);c_addr.sin_family = AF_INET;c_addr.sin_port = htons(8888);int len = sizeof(c_addr);result = connect(c_socket, (sockaddr*)&c_addr, len);if (result == INVALID_SOCKET) {cout << "connect error" << endl;return 0;}char sendbuf[1024] = { 0 };cout << "client输入数据:";cin >> sendbuf;//sendresult = send(c_socket, sendbuf, sizeof(sendbuf), 0);if (result == SOCKET_ERROR) {cout << "client send error" << endl;return 0;}//recvchar recvbuf[1024] = { 0 };result = recv(c_socket, recvbuf, sizeof(recvbuf), 0);if (result == 0) {cout << "recv error" << endl;return 0;}cout << "servic发送的数据:" << recvbuf << endl;//closeclosesocket(c_socket);WSACleanup();return 0;
}
服务端源码
#include <iostream>
//#include <windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
//#include <stdlib.h>
//#include <stdio.h>
using namespace std;
//导入动态库
#pragma comment(lib,"ws2_32.lib")int __cdecl main(int argc, char** argv) {WSADATA wd; //创建wd的WSADATA对象SOCKET s_socket = INVALID_SOCKET;int result;//初始化winsock//调用WSAStartupresult = WSAStartup(MAKEWORD(2, 2), &wd);if (result != 0) {//printf("WSAStartup 失败:d%\n", result);}//1 创建套接字SOCKET ser_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//判断套接字是否有效if (ser_socket == INVALID_SOCKET) {cout << "套接字不可用";return 0;}//2 绑定端口和地址 sockaddr_in 是一个结构体sockaddr_in addr;/* addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 使用这个会报错*/inet_pton(AF_INET,"127.0.0.1",&addr.sin_addr.S_un.S_addr);addr.sin_family = AF_INET;addr.sin_port = htons(8888);int len = sizeof(addr);result = bind(ser_socket, (LPSOCKADDR)&addr, len);if (result == SOCKET_ERROR) {cout << "socket error"<< result << endl;return 0;}cout << "服务器启动成功,正在等待客户端连接" << endl;//3 监听if (listen(ser_socket, 5) == SOCKET_ERROR) {cout << "listen error" << endl;}FD_SET read_set;//创建文件描述集合FD_ZERO(&read_set);//清空文件描述集合FD_SET(ser_socket, &read_set);//将监听套接字放入文件描述集合timeval timeout{ 0,0 };//select超时设置while (true) {FD_SET temp_set;FD_ZERO(&temp_set);temp_set = read_set;int select_num = select(0, &temp_set, NULL, NULL, &timeout);if (select_num == SOCKET_ERROR) {continue;}for (int i = 0; i < temp_set.fd_count; i++) {SOCKET s_df = temp_set.fd_array[i];if (s_df == ser_socket) { // 判断监听套接字是否就绪//4 接收连接//获取客户端IP地址和端口sockaddr_in client_addr;client_addr.sin_family = AF_INET;int client_len = sizeof(client_addr);s_socket = accept(ser_socket, (sockaddr*)&client_addr, &client_len);if (s_socket == INVALID_SOCKET) {cout << "accept error" << endl;continue;} else {cout << "客户端连接成功" << endl;}char ipbuff[100];string remote_host = inet_ntop(AF_INET, &addr.sin_addr.S_un.S_addr, ipbuff, 20);cout << "接收到客户机:" << remote_host << " 端口号:" << addr.sin_port << endl;// 5接收和发送 char recvbuf[1024] = { 0 };result = recv(s_socket, recvbuf, sizeof(recvbuf), 0);if (result == 0 || result == SOCKET_ERROR) {closesocket(s_df);FD_CLR(s_df, &read_set);//从集中清除套接字cout << "结束连接" << result << endl;}cout << "client发送的数据:" << recvbuf << endl;cout << "service输入数据:";char sendbuf[1024] = { 0 };cin >> sendbuf;result = send(s_socket, sendbuf, sizeof(sendbuf), 0);if (result == SOCKET_ERROR) {cout << "service send error" << endl;}if (s_socket == INVALID_SOCKET) {cout << "socket error" << endl;return 0;}}else {}}}while (s_socket) {}// 6关闭closesocket(s_socket);WSACleanup();system("pause");return 0;
}
相关文章:
C++ socket编程(TCP)
服务端保持监听客户端, 服务端采用select实现,可以监听多个客户端 客户端源码 在这里插入代码片 #include <iostream> //#include <windows.h> #include <WinSock2.h> #include <WS2tcpip.h> using namespace std; #pragma co…...
ldd用于打印程序或库文件所依赖的共享库列表
这是一个Linux命令行指令,将两个常用的命令 ldd 和 grep 组合使用。我来逐一为您解释: ldd: 这是一个Linux工具,用于打印程序或库文件所依赖的共享库列表。通常,当你有一个可执行文件并且想知道它链接到哪些动态库时,你…...

vue+elementUI el-table实现单选
if (selection.length > 1) {this.$refs.table.clearSelection();this.$refs.table.toggleRowSelection(selection.pop());}...

前端组件库造轮子——Message组件开发教程
前端组件库造轮子——Message组件开发教程 前言 本系列旨在记录前端组件库开发经验,我们的组件库项目目前已在Github开源,下面是项目的部分组件。文章会详细介绍一些造组件库轮子的技巧并且最后会给出完整的演示demo。 文章旨在总结经验,开…...

单片机第二季:温度传感器DS18B20
目录 1,DS18B20介绍 2,DS18B20数据手册 2.1,初始化时序 2.2,读写时序 3,DS18B20工作流程 4,代码 1,DS18B20介绍 DS18B20的基本特征: (1)内置集成ADC,外部数字接…...

抓包工具fiddler的基础知识
目录 简介 1、作用 2、使用场景 3、http报文分析 3.1、请求报文 3.2、响应报文 4、介绍fiddler界面功能 4.1、AutoResponder(自动响应器) 4.2、Composer(设计请求) 4.3、断点 4.4、弱网测试 5、app抓包 简介 fiddler是位于客户端和服务端之间的http代理 1、作用 监控浏…...
监控基本概念
监控:这个词在不同的上下文中有不同的含义,在讲到监控MySQL或者监控Redis时,这里只涉及数据采集和可视化,不涉及告警引擎和事件处理。要是监控系统的话,不但包括数据采集和可视化,而且也包括告警和事件发送…...

【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序
文章目录 🍀排序的概念及引用🐱👤排序的概念🐱👓排序运用🐱🐉常见的排序算法 🌴插入排序🎋基本思想:🛫直接插入排序📌算法步骤&…...

【Linux】高级IO --- Reactor网络IO设计模式
人其实很难抵制诱惑,人只能远离诱惑,所以千万不要高看自己的定力。 文章目录 一、LT和ET模式1.理解LT和ET的工作原理2.通过代码来观察LT和ET工作模式的不同3.ET模式高效的原因(fd必须是非阻塞的)4.LT和ET模式使用时的读取方式 二…...

Agisoft Metashape相机标定笔记
Lens Calibration(镜头标定) 使用Metashape进行自动相机标定是可能的。Metashape使用LCD显示屏作为标定目标(可选:使用打印的棋盘格图案,但需保证它是平坦的且单元格是正方形)。 相机标定步骤支持全相机标定矩阵的估计ÿ…...
vue-cropper在ie11下选择本地图片后,无显示、拒绝访问的问题
问题:vue-cropper在ie11下选择本地图片后,网页上并未显示出图片,打开F12有报错:拒绝访问blabla的。但是在chrome下一切正常。 开发环境:node14.17.5 , vue2 , vue-cropper0.6.2 , macOS big sur 11.4(M1). 解决办法&…...

Excel VSTO开发11-自定义菜单项
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 11 自定义菜单项 自定义菜单项可以在插件启动时候添加,即增加到ThisAddIn_Startup() 内。 下面以具体代码说明&#x…...

stm32之30.DMA
DMA(硬件加速方法)一般用于帮运比较大的数据(如:摄像头数据图像传输),寄存器-》DMA-》RAM 或者 RAM-》DMA-》寄存器提高CPU的工作效率 源码-- #include "myhead.h" #include "adc.h"#…...

【LeetCode75】第四十九题 数组中的第K个最大元素
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目很简单,就是给我们一个数组,让我们返回第K大的元素。 那么很直观的一个做法就是我们直接对数组进行降序排序…...

嵌入式面试笔试刷题(day14)
文章目录 前言一、进程控制块1.PCB控制块的作用2.PCB的存储位置 二、进程的三级映射三、return , exit, pthread_exit四、pthread_join作用五、互斥锁和信号量的区别六、怎么判断链表是否有环总结 前言 本篇文章继续我们的刷题之路。 一、进程控制块 这里只讲解进程的PCB控制…...

好用免费的Chat GPT(亲测有用)
1、MindLink麦灵 MindLink麦灵 点进登录后 普通用户可以提问100次 2、你问我答 你问我答 无限次数的。 3、灵感 灵感 点击链接后会提示你如何下载使用。 这个有win版和mac版,点击登陆后,每日都会有30次GPT3/3.5的提问。 4、WebTab 在浏览器插件中…...

SpringBoot项目--电脑商城【上传头像】
一、易错点 1.错误写法: 把文件存到数据库中,需要图片时访问数据库,数据库将文件解析为字节流返回,最后写到本地的某一个文件.这种方法太耗费资源和时间了 2.正确写法: 将对应的文件保存在操作系统上,然后再把这个文件路径记录下来,因为在记录路径的…...

优化SOCKS5的方法
在今天的互联网世界中,保护个人隐私和提升网络速度至关重要。作为一种常用的代理协议,SOCKS5代理服务器不仅可以保护您的隐私,还可以实现更快速的网络访问。本文将为您介绍一些优化SOCKS5代理服务器的方法,以提高网络速度和安全性…...
使用 HelpLook Chatbot,让AI聊天机器人变成销售经理
想要增强AI聊天机器人销售技巧的话,我们需要一个强大的搭建工具来帮助我们增加客户互动,通过很多的客户互动数据来支撑和锻炼我们的AI聊天机器人。在本篇文章中,looklook将会系统地来说说该如何定制聊天机器人的行为。 使用AI聊天机器人的好处…...

MT9700 80mΩ,可调快速响应限流配电开关芯片
MT9700 80mΩ,可调快速响应限流配电开关芯片 特征 符合USB规范 集成80mΩ电源MOSFET 低电源电流 15μA典型开启状态 1μA典型关闭状态 宽输入电压Range:2.4V到5.5V 快速瞬态响应:<2μs 反向电流流阻塞 热关机保护 热插件应…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...