C++ 代码实现socket 类使用TCP/IP进行通信 (windows 系统)

C++ 代码实现socket 类使用TCP/IP进行通信 (windows 系统)

TCP客户端通信常规步骤:

1.初始换socket环境
2.socket()创建TCP套接字。
3.connect()建立到达服务器的连接。
4.与客户端进行通信,recv()/send()接受/发送信息,write()/read() 子进程写入、读取信息
5. close() 关闭客户连接。

具体代码实现如下:

/******************************************************@Copyright (c) 2024, GhY, All rights reserved.*@文件    MySocket.h*@描述    TCP Socket 类封装声明**@作者    GhY*@日期    2024年7月24日*@版本    v1.0.0*****************************************************/
#ifndef __MYSOCKET_H__
#define __MYSOCKET_H__
#include "PublicDefine.h"
#include "sigslot.h"
#include "CIniConfig.h"/**@描述:    Socket 类*@作者:    GhY*@日期:    2024/07/24*@历史:*/
class MySocket : public sigslot::has_slots<>
{
public:typedef sigslot::signal1< Tcp_SendData* > SelectEvent;SelectEvent OnSelectEvent;  // 消息事件
public:MySocket(std::string ip = LOCAL_HOST, int port = PORT, u_long uctl = 1);~MySocket();/**@desc       初始化服务端Ip,Port配置*@param:     ip  port*@return*@author     GhY*@date       2024/07/24*@version    v1.0.0*@history:*/void InitData(const std::string& ip, const int& port);/**@brief    与服务器进行连接*@author   GhY*@date     2024/07/24*/void ClientConnect();/**@brief    关闭socket*@author   GhY*@date     2024/07/24*/void Close();/**@desc       发送数据*@param:     sdata 待发送数据*@return*@author     GhY*@date       2024/07/24*@version    v1.0.0*@history:*/int SendData(const std::string& sdata);/**@brief    接收数据*@author   GhY*@date     2024/07/24*/int ReceiveData();private:/**@brief    初始化WINSOCK*@author   GhY*@date     2024/07/24*/void InitWinsock();private:std::string m_ip;int m_port;u_long m_uctl;  // 阻塞方式:1=非阻塞,0=阻塞 默认1SOCKET m_socket;
};#endif //!__MYSOCKET_H__
/****************************************************
*
*@Copyright (c) 2024, GhY, All rights reserved.
*@文件    MySocket.h
*@描述    TCP Socket 类封装实现
*
*@作者    GhY
*@日期    2024年7月24日
*@版本    v1.0.0
*
****************************************************/
#include "MySocket.h"
#include"winerror.h"
#pragma comment(lib, "ws2_32")
#include <time.h>
#include "CIniConfig.h"using namespace std;MySocket::MySocket(std::string ip, int port, u_long uctl): m_ip(ip), m_port(port), m_uctl(uctl), m_socket(NULL), m_socketClient(NULL)
{
}MySocket::~MySocket()
{Close();
}void MySocket::InitData(const std::string& ip, const int& port)
{if (ip.empty()) {m_ip = LOCAL_HOST;} else {m_ip = ip;}m_port = port;InitWinsock();
}void MySocket::InitWinsock()
{// 初始化WINSOCKWORD wVersionRequested = MAKEWORD(2, 2);WSADATA wsd;if (WSAStartup(wVersionRequested, &wsd) != 0) {std::cout << ("init WSAStartup faild") << std::endl;}if (LOBYTE(wsd.wVersion) != 2 ||HIBYTE(wsd.wVersion) != 2) {WSACleanup();std::cout << "WSACleanup" << std::endl;return;}
}/************************************************************************/
/*                              客户端                                  */
/************************************************************************/void MySocket::ClientConnect()
{if (m_port == 0) {m_port = PORT;}if (m_ip.empty()) {m_ip = LOCAL_HOST; //本地回路地址127,用于一台机器上测试的IP}m_socket = socket(AF_INET, SOCK_STREAM, 0);if (SOCKET_ERROR == m_socket) {std::cout << (" create socket failed !!!") << std::endl;return;}int ret = ioctlsocket(m_socket, FIONBIO, &m_uctl);     //阻塞方式   FIONBIO 允许或者禁止套接字m_socket非阻塞模式  0=阻塞if (SOCKET_ERROR == ret) {std::cout << (" set ioctlsocket faild: model") << m_uctl << std::endl;return ;}SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = inet_addr(m_ip.c_str());//地址,addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(m_port);//和服务器端的端口号保持一致connect(m_socket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//连接服务器端(套接字,地址转换,长度)
}void MySocket::Close()
{if (m_socket != NULL) {closesocket(m_socket);  //关闭套接字,释放为这个套接字分配的资源m_socket = NULL;}WSACleanup();//终止对这个套接字库的使用
}int MySocket::SendData(const std::string& sdata)
{char sendBuf[SEND_DATA_LEN];memset(sendBuf, 0, sizeof(sendBuf));std::string strId = g_ConfigPtr.getConfigValueWithKey("base", "id").c_str();std::string strName = g_ConfigPtr.getConfigValueWithKey("base", "name").c_str();int ihead = sizeof(TcpHead);int ibody = sizeof(TcpBody);Tcp_SendData* pData = (Tcp_SendData*)sendBuf;pData->_head._node = strId.empty() ? 0 : atoi(strId.c_str());pData->_head._type = 0;pData->_head._time = time(NULL);TcpBody tBody;tBody._length = sdata.length();memcpy(tBody._data, sdata.c_str(), sdata.length() + 1);memcpy(tBody._srcName, strName.c_str(), strName.length() + 1);memcpy(&sendBuf[ihead], &tBody, ibody);int sendLen = ihead + ibody;int ret = send(m_socket, sendBuf, sendLen, 0);return ret;
}int MySocket::ReceiveData()
{std::string* redata = nullptr;sockaddr_in sin;int slen = sizeof(sin);char reBuf[SEND_DATA_LEN] = {0};int ret = recvfrom(m_socket, reBuf, SEND_DATA_LEN, 0, (sockaddr*)&sin, &slen);if (ret > 0) {Tcp_SendData* pData = (Tcp_SendData*)reBuf;//printf("%s\n", reBuf);OnSelectEvent.emit(pData);}return ret;}

注意:

依赖的部分文件(.h,.cpp文件)见本专栏其他文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 小区小朋友统计(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势&#xff1a;挑战&#xff1a; 《CSS创意项目实践&…

(一)延时任务篇——延时任务的几种实现方式概述

前言 延时任务是我们在项目开发中经常遇到的场景&#xff0c;例如订单超时30分钟自动取消&#xff0c;邮件5分钟后通知等等&#xff0c;对于这样的应用场景&#xff0c;我们又该如何应对呢&#xff0c;尤其是在微服务环境下&#xff0c;如何保证我们的延迟任务并发问题以及数据…

AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘

AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘ 目录 AttributeError: module ‘selenium.webdriver‘ has no attribute ‘PhantomJS‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的…

数据结构初阶 · 二叉搜索树

目录 前言: 二叉搜索树的实现 二叉搜索树的基本结构 增 查 中序遍历 删 前言: 在最初学习二叉树的时候&#xff0c;就提及到过单独用树来存储数据是既不如链表也不如顺序表的&#xff0c;二叉树的用处可以用来排序&#xff0c;比如堆排序&#xff0c;也可以用来搜索数据…

java-数据结构与算法-02-数据结构-05-栈

文章目录 1. 栈1. 概述2. 链表实现3. 数组实现4. 应用 2. 习题E01. 有效的括号-Leetcode 20E02. 后缀表达式求值-Leetcode 120E03. 中缀表达式转后缀E04. 双栈模拟队列-Leetcode 232E05. 单队列模拟栈-Leetcode 225 1. 栈 1. 概述 计算机科学中&#xff0c;stack 是一种线性的…

netty入门-3 EventLoop和EventLoopGroup,简单的服务器实现

文章目录 EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop 处理普通任务与定时任务 结语 EventLoop和EventLoopGroup 二者大概是什么这里不再赘述&#xff0c;前一篇已简述过。 不理解也没关系。 下面会简单使用&#xff0c;看了就能明白是什么 这…

第124天:内网安全-代理 Sockets协议路由不出网后渗透通讯CS-MSF 控制上线

目录 思维导图 环境配置 案例一&#xff1a;网络通讯&控制上线--CS-路由添加&节点建立&协议生成&正反连接 案例二&#xff1a;网络通讯&控制上线--MSF-路由添加&节点建立&协议生成&正反连接 思维导图 环境配置 这里由于系统内存问题我只设…

Python的人脸识别程序

1.录入人脸&#xff0c;输入ID号 haarcascade_frontalface_default.xml # 导入模块 import os import numpy as np import cv2 as cv import cv2face_detector cv2.CascadeClassifier(rD:\Automation_All_Files\OCR\haarcascade_frontalface_default.xml) # 待更改# 为即将…

Windows10+vs 2017中创建WEB API教程

我们如果需要用到web api怎么办&#xff1f;一般来说可以自己开发和去使用别人开发好的api&#xff0c;今天我们来讲一下Windows10vs 2017中创建web Api的教程。目前本教程当中的方法在Win10 VS2017&#xff08;MVC5&#xff09;win server2016vs2017&#xff0c;vs2013 vs201…

网安人必须人手一份的《Linux私房教程》,GitHub星标286K!

Linux是一套免费使用和自由传播的操作系统内核&#xff0c;是一个基于POSIX和Unix的多用户、多任务支持多线程和多CPU的操作系统内核。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个性能稳…

【iOS】GCD

参考文章&#xff1a;GCD函数和队列原理探索 之前写项目的时候&#xff0c;进行耗时的网络请求使用GCD处理过异步请求&#xff0c;但对一些概念都很模糊&#xff0c;这次就来系统学习一下GCD相关 相关概念 什么是GCD&#xff1f; Grand Center Dispatch简称GCD&#xff0c;是…

ChatTTS真人文本转语音模型,富有韵律与情感,且免费开源

上期图文教程&#xff0c;我们分享了微软TTS真人转语音大模型&#xff0c;但是微软的TTS模型只有针对新用户免费一年&#xff0c;其他用户都是收费的&#xff0c;虽然微软开源了部分TTS的功能&#xff0c;但是针对真人类似的富有情感的TTS模型并没有进行开源&#xff0c;本期介…

软件测试基础1--功能测试

1、什么是软件测试&#xff1f; 软件是控制计算机硬件运行的工具。 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求&#xff0c;为了发现软件功能和需求不相符合的地方&#xff0c;或者寻找实际输出和预期输出之间的差异。 软件测试的目的&#xff1a;减少软件缺陷…

学习笔记之JAVA篇(0724)

p 方法 方法声明格式&#xff1a; [修饰符1 修饰符2 ...] 返回值类型 方法名&#xff08;形式参数列表&#xff09;{ java语句;......; } 方法调用方式 普通方法对象.方法名&#xff08;实参列表&#xff09;静态方法类名.方法名&#xff08;实参列表&#xff09; 方法的详…

【YashanDB知识库】YashanDB的JDBC/OCI驱动如何设置字符编码

问题现象 Oracle、Mysql数据库链接串&#xff0c;JDBC驱动连接串可以指定客户端的编码格式&#xff1a; jdbc:mysql://hostname:port/database_name?useUnicodetrue&characterEncodingutf8mb4 jdbc:oracle:thin://hostname:port/service_name?NLS_LANGUAGEAMERICAN&am…

【SQL语句大全(MySQL)】

SQL语法 添加删除修改查询基本查询条件查询分组函数/聚合函数分组查询排序分页查询&#xff08;限制查询&#xff09;多表查询连接查询根据年代分类连接查询根据连接方式分类1、内连接2、左外连接3、右外连接 多张表连接的语法格式 嵌套查询 SQL语句书写顺序 添加 INSERT INTO…

构建生成工具cmake的使用(1)

ps:本文是对cmake的基础讲解&#xff0c;掌握后解决70-80%情况是足以应对的&#xff0c;后续会对cmake有进阶内容。 一 前言 CMake 是一个工具&#xff0c;帮助开发者管理和自动化软件项目的构建过程。它使用一个叫做CMakeLists.txt 的文本文件来描述项目的组织结构、编译选项…

h5图片压缩后变为base64格式的流地址上传服务器

**操作逻辑&#xff1a;前端把图片压缩变为base64格式的流地址&#xff0c;然后把base64格式的流地址传输到后端进行上传到cos服务器 操作流程** 1.前端&#xff1a;我这里是通过uniapp开发h5的&#xff0c;upLoadPutBase64是封装好的上传后端服务器的接口 div写上 <helan…

oracle数据库下的定时任务,如何创建Jobs

oarcle中写存储过程&#xff0c;上面的文章中已经介绍过了&#xff0c;这次是写好存储过程后&#xff0c;在Jobs文件夹中新建job,达到定时执行任务的目的。 1、在plsql数据库中&#xff0c;找到左边的Jobs,右键点击新建&#xff0c;如下图&#xff1a; 2、按照下图将相应的项添…