废话不多说, 直入主题, 我们在写客户单的时候希望在哪里发消息出去,然后在哪里返回消息(同步), 然后继续往下运行-, 而不是在这里发送了一个消息给服务端, 在另一个地方接受消息(异步) , 也不知道等多久, 才收到消息, 等收到消息在通知发送消息的地方, 让程序继续往下运行, 这样想想异步实在太麻烦了,

  实现同步的思想: 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客户端网络消息发送接收同步实现的更多相关文章

  1. activemq安装与简单消息发送接收实例

    安装环境:Activemq5.11.1, jdk1.7(activemq5.11.1版本需要jdk升级到1.7),虚拟机: 192.168.147.131 [root@localhost softwa ...

  2. 在使用TCP协议进行消息发送时,对消息分帧

    成帧与解析 阅读 <java TCP/IP Socket 编程>第三章笔记 成帧技术(frame)是解决如何在接收端定位消息的首尾位置的问题.在进行数据收发时,必须指定消息接收者如何确定何 ...

  3. XMPP客户端开发(2)--发送接收消息

    客户端连接上服务器并登录以后,可以发送.接收消息. 首先需要定义Chat,MessageListener和ChatMessageListener几个变量: private static Chat ch ...

  4. 使用tcpdump监控网络消息发送

    tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具.tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具. tcpd ...

  5. TCP/IP网络

    1.  简述osi七层模型和TCP/IP五层模型 一.OSI参考模型         今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型.  1.OSI的来源         OSI(Op ...

  6. 一张图进阶 RocketMQ - 消息发送

    前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ...

  7. ActiveMQ JMS实现消息发送

    一.创建配置消息发送接收目的地. ActiveMQ中间件地址 JMS_BROKER_URL=failover://(tcp://192.168.1.231:61616) QUEUE_BUSP_TP_S ...

  8. [NIO]用dawn发送接收HTTP请求

    HTTP协议的下层使用的是tcp.所以我们建立一个tcp连接就能发送接收http请求.dawn底层使用了nio.可是经过dawn的封装之后,我们在编写代码的时候,就和使用普通的堵塞式socket一样 ...

  9. Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)

    一.实现功能 1.服务器端选择待发送的文件,可以是多个 2.开启服务器,支持多客户端接入,能够实时显示每个客户端接入状态 3.等待所有客户端都处于已连接状态时,依次发送文件集给每个客户端,显示每个客户 ...

随机推荐

  1. 如何查看PDF的坐标

    有时候,我们明知道现状并不够科学.不够合理,但没有时间和条件去改变现状,还得硬要照着这种方式去维护,很是痛苦. 在程序生成文字报告通常使用docx,如果需要更通用.更灵活,还可以使用rtf,而前期设计 ...

  2. 1+x 证书 Web 前端开发初级理论考试(试卷8 )

    Web前端开发初级模拟测试卷(三) 共55道题 总分:200分 形考总分:0分 一.单选题共30题,60分 1.实现向右的红色三角形,样式实现正确的是( ) A <div class=" ...

  3. app自动化测试环境搭建之node+appium+ADT+MUMU模拟器

    一.安装Microsoft .NET Framework 4.5 检测本机已安装的程序中,是否已经安装Microsoft .NET Framework 4.5及以上的版本 如果没有安装,则获取安装文件 ...

  4. Javascript模块化开发4——Grunt常用模块

    一.copy 用于复制文件与目录. grunt-contrib-copy 二.eslint 检测代码的合理性. grunt-eslint 常见参数: 1.quiet 是否只显示errors.默认值fa ...

  5. vue 仿微信朋友圈9张图上传功能

    项目需求要求用户上传商品的时候可以一次性上传9张图,多余9张提示‘只能上传9张图’,并且每张图右上角有个删除按钮,图片也可以点击放大. 出来的效果图如下: 话不多说,上代码: <el-form- ...

  6. jQuery 源码分析(十) 数据缓存模块 data详解

    jQuery的数据缓存模块以一种安全的方式为DOM元素附加任意类型的数据,避免了在JavaScript对象和DOM元素之间出现循环引用,以及由此而导致的内存泄漏. 数据缓存模块为DOM元素和JavaS ...

  7. vue中$refs的用法及作用详解

    一般来讲,获取DOM元素,需要使用document.querySelector('#input1')方法去获取dom节点,然后再获取input1的值. 但是使用了ref绑定之后,我们就不需要再获取do ...

  8. java 接口中的成员变量与方法

    java接口中变量的默认修饰符为 public static final int i = 3; 相当于 public static final int i = 3; java接口中方法的默认修饰符为 ...

  9. Think in Speed (关于速度的一点思考)

    天下武功,无坚不摧,唯快不破!所以我们重视速度没毛病! 老话说:不要过早优化.赞同! 我们在写代码过程中,有时可能就是为了追求所谓的性能,然后,就给自己挖坑了. 关于开发速度,我有以下几点思考: 1. ...

  10. C# WebClient,HttpClient,WebRequest

    static void WebClientDemo() { string url = "https://www.cnblogs.com/Fred1987/p/11843418.html&qu ...