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 反向电流流阻塞 热关机保护 热插件应…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
