当前位置: 首页 > news >正文

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)

服务端保持监听客户端&#xff0c; 服务端采用select实现&#xff0c;可以监听多个客户端 客户端源码 在这里插入代码片 #include <iostream> //#include <windows.h> #include <WinSock2.h> #include <WS2tcpip.h> using namespace std; #pragma co…...

ldd用于打印程序或库文件所依赖的共享库列表

这是一个Linux命令行指令&#xff0c;将两个常用的命令 ldd 和 grep 组合使用。我来逐一为您解释&#xff1a; ldd: 这是一个Linux工具&#xff0c;用于打印程序或库文件所依赖的共享库列表。通常&#xff0c;当你有一个可执行文件并且想知道它链接到哪些动态库时&#xff0c;你…...

vue+elementUI el-table实现单选

if (selection.length > 1) {this.$refs.table.clearSelection();this.$refs.table.toggleRowSelection(selection.pop());}...

前端组件库造轮子——Message组件开发教程

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

单片机第二季:温度传感器DS18B20

目录 1&#xff0c;DS18B20介绍 2&#xff0c;DS18B20数据手册 2.1&#xff0c;初始化时序 2.2&#xff0c;读写时序 3&#xff0c;DS18B20工作流程 4&#xff0c;代码 1&#xff0c;DS18B20介绍 DS18B20的基本特征&#xff1a; (1)内置集成ADC&#xff0c;外部数字接…...

抓包工具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、作用 监控浏…...

监控基本概念

监控&#xff1a;这个词在不同的上下文中有不同的含义&#xff0c;在讲到监控MySQL或者监控Redis时&#xff0c;这里只涉及数据采集和可视化&#xff0c;不涉及告警引擎和事件处理。要是监控系统的话&#xff0c;不但包括数据采集和可视化&#xff0c;而且也包括告警和事件发送…...

【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序

文章目录 &#x1f340;排序的概念及引用&#x1f431;‍&#x1f464;排序的概念&#x1f431;‍&#x1f453;排序运用&#x1f431;‍&#x1f409;常见的排序算法 &#x1f334;插入排序&#x1f38b;基本思想&#xff1a;&#x1f6eb;直接插入排序&#x1f4cc;算法步骤&…...

【Linux】高级IO --- Reactor网络IO设计模式

人其实很难抵制诱惑&#xff0c;人只能远离诱惑&#xff0c;所以千万不要高看自己的定力。 文章目录 一、LT和ET模式1.理解LT和ET的工作原理2.通过代码来观察LT和ET工作模式的不同3.ET模式高效的原因&#xff08;fd必须是非阻塞的&#xff09;4.LT和ET模式使用时的读取方式 二…...

Agisoft Metashape相机标定笔记

Lens Calibration(镜头标定) 使用Metashape进行自动相机标定是可能的。Metashape使用LCD显示屏作为标定目标&#xff08;可选&#xff1a;使用打印的棋盘格图案&#xff0c;但需保证它是平坦的且单元格是正方形&#xff09;。 相机标定步骤支持全相机标定矩阵的估计&#xff…...

vue-cropper在ie11下选择本地图片后,无显示、拒绝访问的问题

问题&#xff1a;vue-cropper在ie11下选择本地图片后&#xff0c;网页上并未显示出图片&#xff0c;打开F12有报错&#xff1a;拒绝访问blabla的。但是在chrome下一切正常。 开发环境&#xff1a;node14.17.5 , vue2 , vue-cropper0.6.2 , macOS big sur 11.4(M1). 解决办法&…...

Excel VSTO开发11-自定义菜单项

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

stm32之30.DMA

DMA&#xff08;硬件加速方法&#xff09;一般用于帮运比较大的数据&#xff08;如&#xff1a;摄像头数据图像传输&#xff09;&#xff0c;寄存器-》DMA-》RAM 或者 RAM-》DMA-》寄存器提高CPU的工作效率 源码-- #include "myhead.h" #include "adc.h"#…...

【LeetCode75】第四十九题 数组中的第K个最大元素

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目很简单&#xff0c;就是给我们一个数组&#xff0c;让我们返回第K大的元素。 那么很直观的一个做法就是我们直接对数组进行降序排序…...

嵌入式面试笔试刷题(day14)

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

好用免费的Chat GPT(亲测有用)

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

SpringBoot项目--电脑商城【上传头像】

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

优化SOCKS5的方法

在今天的互联网世界中&#xff0c;保护个人隐私和提升网络速度至关重要。作为一种常用的代理协议&#xff0c;SOCKS5代理服务器不仅可以保护您的隐私&#xff0c;还可以实现更快速的网络访问。本文将为您介绍一些优化SOCKS5代理服务器的方法&#xff0c;以提高网络速度和安全性…...

使用 HelpLook Chatbot,让AI聊天机器人变成销售经理

想要增强AI聊天机器人销售技巧的话&#xff0c;我们需要一个强大的搭建工具来帮助我们增加客户互动&#xff0c;通过很多的客户互动数据来支撑和锻炼我们的AI聊天机器人。在本篇文章中&#xff0c;looklook将会系统地来说说该如何定制聊天机器人的行为。 使用AI聊天机器人的好处…...

MT9700 80mΩ,可调快速响应限流配电开关芯片

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

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...