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

ops/2024/9/25 5:10:40/

windows__0">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.ppmy.cn/ops/85997.html

相关文章

51单片机和STM32区别

51单片机和 STM32 区别 51单片机和 STM32 是两种常见的微控制器&#xff0c;它们在架构、性能、外设接口、功耗和开发环境等方面有所不同。 1. 架构差异 51单片机基于传统的哈佛总线结构&#xff0c;采用 CISC 架构&#xff0c;而 STM32 基于 ARM Cortex-M 系列的32位处理器核…

Redisson中RQueue的使用场景附一个异步的例子

RQueue 是一个基于 Redis 的分布式作业队列系统&#xff0c;它允许开发者在 Ruby 应用程序中实现异步任务处理和计划任务调度。由于 Redis 提供了高性能的内存数据结构存储&#xff0c;RQueue 可以快速地存储和检索队列中的任务&#xff0c;这使得它非常适合于高并发和低延迟的…

pytorch backbone

1 简介 在PyTorch深度学习中&#xff0c;预训练backbone&#xff08;骨干网络&#xff09;是一个常见的做法&#xff0c;特别是在处理图像识别、目标检测、图像分割等任务时。预训练backbone通常是指在大型数据集&#xff08;如ImageNet&#xff09;上预先训练好的卷积神经网络…

后端开发工程师vue2初识的学习

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 什么是Vue&#xff1f; Vue &#xff08;通常指 Vue.js&#xff09;是一个用…

【概率论】第一章:概率论基本概念

文章目录 一. 随机事件与空间样本二. 事件间的关系与事件的运算三. 概率、条件概率、事件独立性与五大公式1. 概率2. 条件概率3. 事件独立性4. 五大公式 四. 古典型、几何型概率、伯努利试验 确定现象&#xff1a;磁极同性相斥 随机现象&#xff1a;在单次实验结果中呈现出不确…

Java 不可变Map练习 (2024.7.28)

CollectionExercise3 package CollectionExercise20240728;import java.util.HashMap; import java.util.Map; import java.util.Set;public class CollectionExercise3 {public static void main(String[] args) {// 不可变的Map集合// Map中键是不可以重复的// Map中的of方法…

GPT-4o Mini 模型的性能与成本优势全解析

GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8; &#x1f31f; GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8;摘要引言正文内容GPT-4o Mini 模型简介 &#x1f680;性能测试与对比 &#x1f4ca;应用场景 &#x1f310;自然语言处理对话系统内容生成 ✍️ &am…

【React】全面解析:从基础知识到高级应用,掌握现代Web开发利器

文章目录 一、React 的基础知识1. 什么是 React&#xff1f;2. React 的基本概念3. 基本示例 二、React 的进阶概念1. 状态&#xff08;State&#xff09;和属性&#xff08;Props&#xff09;2. 生命周期方法&#xff08;Lifecycle Methods&#xff09;3. 钩子&#xff08;Hoo…