当前位置: 首页 > 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 反向电流流阻塞 热关机保护 热插件应…...

卷积计算常见误区解析:为什么你的结果和理论值对不上?

卷积计算常见误区解析&#xff1a;为什么你的结果和理论值对不上&#xff1f; 在图像处理和深度学习领域&#xff0c;卷积操作是基础中的基础。但令人惊讶的是&#xff0c;即使是经验丰富的开发者&#xff0c;在实际编码时也常常遇到计算结果与预期不符的情况。这就像做菜时严格…...

AWPortrait-Z WebUI日志诊断指南:从webui_startup.log定位90%常见问题

AWPortrait-Z WebUI日志诊断指南&#xff1a;从webui_startup.log定位90%常见问题 1. 引言&#xff1a;为什么需要关注启动日志 当你启动AWPortrait-Z WebUI时&#xff0c;系统会自动生成一个名为webui_startup.log的日志文件。这个文件就像是系统的"健康检查报告"…...

收藏!30岁转行AI大模型,来得及吗?小白程序员必看的真实转型干货

“30岁&#xff0c;人生好像走到了岔路口&#xff0c;转行还来得及吗&#xff1f;”这是很多职场人遭遇瓶颈时&#xff0c;都会反复纠结的问题。尤其是面对AI大模型这样的新兴领域&#xff0c;不少人既心动又胆怯——怕年龄太大、怕没有基础、怕跟不上节奏。但今天我想明确告诉…...

终极指南:如何使用RPGMakerDecrypter轻松解密游戏资源

终极指南&#xff1a;如何使用RPGMakerDecrypter轻松解密游戏资源 【免费下载链接】RPGMakerDecrypter Tool for extracting RPG Maker XP, VX and VX Ace encrypted archives. 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerDecrypter RPGMakerDecrypter是一款…...

用计算机科学与技术的视角,把谈恋爱流程化:构建可运行、可调试、可迭代的情感操作系统

用计算机科学与技术的视角&#xff0c;把谈恋爱流程化&#xff1a;构建可运行、可调试、可迭代的情感操作系统 善灵驿站 成长心理 技术思维深度融合系列 作者&#xff1a;培风图南以星河揽胜 专栏链接&#xff1a;善灵驿站 &#x1f4cc; 导读&#xff1a;为什么技术人更需要…...

避坑指南:Silvaco TCAD光电仿真中,均匀光与高斯光设置对结果影响的深度解析

避坑指南&#xff1a;Silvaco TCAD光电仿真中均匀光与高斯光设置的深度解析 在光电探测器仿真领域&#xff0c;光源模型的精确设置往往是被忽视却至关重要的环节。许多工程师花费大量时间优化器件结构和材料参数&#xff0c;却在光源设置环节草率处理&#xff0c;导致仿真结果与…...

百川2-13B-4bits模型调优:OpenClaw任务响应速度提升50%的3个技巧

百川2-13B-4bits模型调优&#xff1a;OpenClaw任务响应速度提升50%的3个技巧 1. 问题背景与优化动机 去年冬天&#xff0c;当我第一次将百川2-13B-4bits模型接入OpenClaw时&#xff0c;发现一个奇怪现象&#xff1a;同样的自动化任务&#xff0c;在本地测试时响应飞快&#x…...

Wave-U-Net:革新音频分离技术的端到端深度学习解决方案

Wave-U-Net&#xff1a;革新音频分离技术的端到端深度学习解决方案 【免费下载链接】Wave-U-Net Implementation of the Wave-U-Net for audio source separation 项目地址: https://gitcode.com/gh_mirrors/wa/Wave-U-Net 在数字音频处理领域&#xff0c;从混合音频中精…...

嵌入式开发中回调函数的解耦实践与高级应用

1. 回调函数在嵌入式开发中的解耦实践在嵌入式系统开发中&#xff0c;模块间的耦合度直接影响着代码的可维护性和可扩展性。最近我在重构一个智能家居项目时&#xff0c;就遇到了模块间强耦合导致修改困难的问题。通过引入回调函数机制&#xff0c;成功将原本紧密交织的代码逻辑…...

QT:Tab Widget的进阶应用与实战技巧

1. Tab Widget的动态管理技巧 第一次用QT做带标签页的界面时&#xff0c;我习惯在设计器里把Tab页都固定好。直到接手一个需要动态加载配置文件的仪表盘项目&#xff0c;才发现动态增删Tab才是真实开发中的常态。比如用户点击"新建图表"按钮时&#xff0c;我们需要实…...