C++ TCP客户端网络消息发送接收同步实现
废话不多说, 直入主题, 我们在写客户单的时候希望在哪里发消息出去,然后在哪里返回消息(同步), 然后继续往下运行-, 而不是在这里发送了一个消息给服务端, 在另一个地方接受消息(异步) , 也不知道等多久, 才收到消息, 等收到消息在通知发送消息的地方, 让程序继续往下运行, 这样想想异步实在太麻烦了,
实现同步的思想: 1 将socket设置成阻塞的, 2: 设置接受超时, 3: 消息类型区分
直接上代码
封装socket 头文件
#pragma once
#include <string>
#include <Winsock2.h> using namespace std;
class TcpSocket
{
public:
TcpSocket();
~TcpSocket(); bool SocketInit();
bool CreatSocket(string strIp, int nPort);
bool SendMsg(int msgType, string strSendBuf, string& strRecvMsg, int iTimeOut); private:
SOCKET m_Scoket;
DWORD m_dwVserion;
WSADATA m_WsData;
int m_iError;
bool m_isSocketFlag;
};
socket封装实现
#include "TcpSocket.h"
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996) TcpSocket::TcpSocket()
{
m_dwVserion = ;
m_isSocketFlag = true;
memset(&m_WsData, , sizeof(WSADATA));
} TcpSocket::~TcpSocket()
{
closesocket(m_Scoket);
WSACleanup();
} bool TcpSocket::SocketInit()
{
m_dwVserion = MAKEWORD(, );
m_iError = WSAStartup(m_dwVserion, &m_WsData);
if (m_iError != )
{
printf("socket 初始化操作失败");
m_isSocketFlag = false;
}
if (LOBYTE(m_WsData.wVersion) != && HIBYTE(m_WsData.wVersion) != )
{
WSACleanup();
m_isSocketFlag = false;
}
return m_isSocketFlag;
} bool TcpSocket::CreatSocket(string strIp, int nPort)
{
if (!m_isSocketFlag)
return false;
m_Scoket = socket(AF_INET, SOCK_STREAM, );
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr(strIp.c_str());
addr.sin_family = AF_INET;
addr.sin_port = htons(nPort); m_iError = connect(m_Scoket, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if(m_iError != )
m_isSocketFlag = false;
return m_isSocketFlag;
} bool TcpSocket::SendMsg(int MsgType, string strSendBuf, string& strRecvMsg, int iTimeOut)
{
if (!m_isSocketFlag)
return false;
int timeOut = iTimeOut * ; //秒
setsockopt(m_Scoket, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeOut, sizeof(timeOut));
setsockopt(m_Scoket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeOut, sizeof(timeOut));
printf("开始发送消息\n");
int iRet = send(m_Scoket, strSendBuf.c_str(), strSendBuf.length(), );
if (iRet == )
{
printf("发送消息超时\n");
return false;
}
printf("发送消息: %s\n", strSendBuf.c_str());
char recvBuf[] = { };
iRet = recv(m_Scoket, recvBuf, sizeof(recvBuf), );
if (iRet == -)
{
printf("接受消息超时\n");
return false;
}
string recvMsg = string(recvBuf);
if (recvMsg.find(to_string(MsgType)) == string::npos)
return false;
strRecvMsg = string(recvBuf);
return true;
}
测试程序:
#include <stdio.h>
#include "TcpSocket.h" int main()
{
TcpSocket client;
bool isRet = client.SocketInit();
if (!isRet)
return ;
isRet = client.CreatSocket("10.1.1.66", ); if (isRet)
{
while()
{
string strRecv = string();
client.SendMsg(, string("Hello"), strRecv, );
printf("接受消息: %s\n", strRecv.c_str());
Sleep();
}
}
getchar();
return ;
}
以上是个人拙见, 若有更好的方法请指教小弟, 谢谢! 谢谢! 谢谢!
C++ TCP客户端网络消息发送接收同步实现的更多相关文章
- activemq安装与简单消息发送接收实例
安装环境:Activemq5.11.1, jdk1.7(activemq5.11.1版本需要jdk升级到1.7),虚拟机: 192.168.147.131 [root@localhost softwa ...
- 在使用TCP协议进行消息发送时,对消息分帧
成帧与解析 阅读 <java TCP/IP Socket 编程>第三章笔记 成帧技术(frame)是解决如何在接收端定位消息的首尾位置的问题.在进行数据收发时,必须指定消息接收者如何确定何 ...
- XMPP客户端开发(2)--发送接收消息
客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...
- 使用tcpdump监控网络消息发送
tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpd ...
- TCP/IP网络
1. 简述osi七层模型和TCP/IP五层模型 一.OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型. 1.OSI的来源 OSI(Op ...
- 一张图进阶 RocketMQ - 消息发送
前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ...
- ActiveMQ JMS实现消息发送
一.创建配置消息发送接收目的地. ActiveMQ中间件地址 JMS_BROKER_URL=failover://(tcp://192.168.1.231:61616) QUEUE_BUSP_TP_S ...
- [NIO]用dawn发送接收HTTP请求
HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...
随机推荐
- Pytorch创建模型的多种方法
目录 Method 1 Method 2 Method 3 Method 4 Reference 网络结构: conv --> relu --> pool --> FC -- > ...
- Python骚操作:Python控制Excel实现自动化办公!
1.安装 2.操作一个简单的Excel文档 操作注释及代码: 操作完成后,数据存储结果如下: 3. 操作简单Excel文档并添加数据格式 操作代码如下:附带数据格式的定义 操作效果 ...
- 【转】理解ASP.NET Core验证模型(Claim, ClaimsIdentity, ClaimsPrincipal)不得不读的英文博文
这篇英文博文是 Andrew Lock 写的 Introduction to Authentication with ASP.NET Core . 以下是简单的阅读笔记: -------------- ...
- NumPy 学习 第四篇:数组的基本操作
在数组中,用axis(轴)表示维度,对于三维数组,axis参数的取值通常有: 当axis=None时,表示把数组展开为一维数组: 当axis=0时,表示按照行(第一维)进行计算: 当axis=1时,表 ...
- Java SPI机制实战详解及源码分析
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现 ...
- DedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221)
dedeCMS V5.7 SP2后台代码执行漏洞复现(CNVD-2018-01221) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2 ...
- Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application-笔记
参考 Abp vNext框架 从空项目开始 使用ASP.NET Core Web Application http://www.vnfan.com/helinbin/d/745b1e040c9b4f6 ...
- C#中巧用Lambda表达式实现对象list进行截取
场景 有一个对象的list,每个对象有唯一的属性Id,并且是从1递增,现在要根据此Id属性进行截取. 其中DataTreeNode 实现 Global.Instance.PrepareCompareD ...
- HTTP 压测工具wrk简介
前段时间项目压测,看到开发命令行下使用这个命令进行压测非常简洁.方便,萌发了学习的兴趣,这里仅做简单介绍. 安装 wrk支持大多数UNIX系统,不支持Windows.需要操作系统支持LuaJIT和Op ...
- XHR 对象实例所有的配置、属性、方法、回调和不可变值
当我们声明了一个XMLHttpRequest对象的实例的时候,使用for-in来循环遍历一下这个实例(本文使用的是chrome45版本浏览器),我们会发现在这个实例上绑定了一些内容,我把这些内容进行了 ...