SokcetClient VC++6.0
// SokcetClient.cpp: implementation of the SokcetClient class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "SokcetClient.h"
#include <iostream>
#include <Ws2tcpip.h>
#include "StringHelper.h"
#include "LoginResponse.h"
#include "HeartBeatRequest.h"
#include <string.h>
#include <stdio.h>
#include <Windows.h>
#include <map>
#include <cctype>
#include <algorithm>
#include "MyDefine.h"
#include "MD5.h"
#include <functional>
#include "StringHelper.h"
#include "JsonHelper.h"
#include <process.h>
#include <list> using namespace std; static bool IsCloseSocket = false;
static SOCKET m_nLocalSocket;
static HANDLE reciveHandel;
static HANDLE heartbeatHandel;
static string IP;
static int Port;
static string ClientNo;
static string ClientName;
static string Key;
static string ParkingNo;
static string ParkingName;
static IPaySDKAPI* paySDKAPI;
static int nRet = SOCKET_ERROR; typedef list<string> ListString;
static ListString listJson; SokcetClient::SokcetClient()
{
m_nLocalSocket = -;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(, ), &wsaData) != ) {
std::cout << "Socket版本加载失败" << std::endl;
}
} SokcetClient::~SokcetClient()
{
closeSocket();
} void SokcetClient::closeSocket()
{
IsCloseSocket = true;
if (m_nLocalSocket != -){
closesocket(m_nLocalSocket); //关闭socket连接
}
m_nLocalSocket = -;
CloseHandle(reciveHandel);
CloseHandle(heartbeatHandel);
WSACleanup(); //终止ws2_32.lib的使用 } DWORD _stdcall SokcetClient::Myrecv(LPVOID lpParameter)
{ int rs = -;
int resultRecv = -;
fd_set rfds;
char m_message[];
int size = sizeof(m_message); while(nRet == SOCKET_ERROR)
{
sockaddr_in m_nServeraddr;
memset(&m_nServeraddr, , sizeof(m_nServeraddr));
m_nServeraddr.sin_family = AF_INET;
m_nServeraddr.sin_port = htons(Port);
m_nServeraddr.sin_addr.s_addr = inet_addr(IP.c_str());
nRet = connect(m_nLocalSocket, (sockaddr*)&m_nServeraddr, sizeof(m_nServeraddr));
if (nRet == SOCKET_ERROR)
{
Sleep();
}
}
while (false == IsCloseSocket)
{ memset(m_message, '\0', size);
FD_ZERO(&rfds);
FD_SET(m_nLocalSocket, &rfds);
struct timeval tv;
tv.tv_sec = ;
tv.tv_usec = ;
rs = select(m_nLocalSocket, &rfds, NULL, NULL, &tv);
if (rs > )
{
resultRecv = recv(m_nLocalSocket, m_message, size, ); if (resultRecv > )
{
//LoginResponse loginResponse; //输出消息
paySDKAPI->receive(m_message); memset(m_message, '\0', size); }
else
{
//这几种错误码,认为连接是正常的,继续接收
if ((resultRecv < ) && (errno == EAGAIN || errno == EINTR))
{
continue;//继续接收数据
}
else
{
m_nLocalSocket = -;
CloseHandle(reciveHandel);
CloseHandle(heartbeatHandel); m_nLocalSocket = socket(AF_INET, SOCK_STREAM , IPPROTO_TCP);
if (m_nLocalSocket != INVALID_SOCKET)
{
int nRet = SOCKET_ERROR;
}
if (m_nLocalSocket != -)
{
sockaddr_in m_nServeraddr;
memset(&m_nServeraddr, , sizeof(m_nServeraddr));
m_nServeraddr.sin_family = AF_INET;
m_nServeraddr.sin_port = htons(Port);
m_nServeraddr.sin_addr.s_addr = inet_addr(IP.c_str());
nRet = connect(m_nLocalSocket, (sockaddr*)&m_nServeraddr, sizeof(m_nServeraddr));
}
if (nRet == SOCKET_ERROR)
{
Sleep();
}
}
}
}
else if ( == rs )
{
if(listJson.size() > && m_nLocalSocket != - && nRet != SOCKET_ERROR)
{
string data = listJson.front();
int size = strlen(data.c_str());
listJson.pop_front();
send(m_nLocalSocket, data.c_str(), size, );
}
} }
return ;
} DWORD _stdcall SokcetClient::MyHeartBeat(LPVOID lpParameter)
{
while (nRet == SOCKET_ERROR)
{
Sleep();
}
while (false == IsCloseSocket)
{
Sleep(*);
if (m_nLocalSocket != -)
{
outputMessage(StringHelper::GBKToUTF8("发送心跳>>>>>>").c_str());
HeartBeatRequest heartBeatRequest;
heartBeatRequest.bizCode = "B1005";
heartBeatRequest.clientName = StringHelper::GBKToUTF8("中心服务器");
heartBeatRequest.clientNo = "";
heartBeatRequest.parkingNo = "";
heartBeatRequest.reqNo = "";
heartBeatRequest.sign = ""; map<std::string, std::string> myMap;
myMap.insert(map<string,string>::value_type("bizCode",heartBeatRequest.bizCode));
myMap.insert(map<string,string>::value_type("clientName",heartBeatRequest.clientName));
myMap.insert(map<string,string>::value_type("clientNo",heartBeatRequest.clientNo));
myMap.insert(map<string,string>::value_type("parkingNo",heartBeatRequest.parkingNo));
myMap.insert(map<string,string>::value_type("reqNo",heartBeatRequest.reqNo));
myMap.insert(map<string,string>::value_type("sign",heartBeatRequest.sign)); map<string, string>::iterator iter;
string str = "";
string key = "";
for (iter = myMap.begin(); iter != myMap.end(); ++iter) {
if (!(*iter).second.empty() && (*iter).second.length() > ) {
key = (*iter).first;
transform(key.begin(), key.end(), key.begin(), tolower);
str = str + key + "=" + (*iter).second + "&";
}
} str = str + "key=909276b944077b0b2123ac89f69d1016"; MD5 md5;
md5.update(str);
heartBeatRequest.sign = md5.toString();
transform(heartBeatRequest.sign.begin(), heartBeatRequest.sign.end(), heartBeatRequest.sign.begin(), toupper);
if(myMap.count("sign") != ){
myMap.erase("sign");
}
myMap.insert(map<string,string>::value_type("sign",heartBeatRequest.sign)); string json2 = JsonHelper::map2jsonstr(myMap);
json2= json2+"\n";
std::cout << json2 << endl;
if (m_nLocalSocket != -)
{
if(listJson.size() < )
{
listJson.insert(listJson.begin(),json2);
}
} }
}
return ;
} bool SokcetClient::ConnectSocket(IPaySDKAPI* iPaySDKAPI,string ip, int prot,string clientNo,string clientName,string parkingNo, string key)
{
paySDKAPI = iPaySDKAPI;
IsCloseSocket = false;
IP = ip;
Port = prot;
if (m_nLocalSocket == -)
{ m_nLocalSocket = socket(AF_INET, SOCK_STREAM , IPPROTO_TCP);
if (m_nLocalSocket != INVALID_SOCKET)
{
outputMessage(StringHelper::GBKToUTF8("客服端socket创建成功").c_str()); } } reciveHandel = CreateThread(NULL,,Myrecv,NULL,,NULL);
heartbeatHandel = CreateThread(NULL,,MyHeartBeat,NULL,,NULL);
return true; } void SokcetClient::Mysend(const char* buffer)
{
if(listJson.size() < )
{
listJson.insert(listJson.begin(),buffer);
}
} void SokcetClient::outputMessage(const char * outstr)
{
std::cout << outstr << std::endl;
}
SokcetClient VC++6.0的更多相关文章
- 目标电脑未安装VC++6.0或者VS,运行APP丢失DLL问题解决办法
一.背景 VS或者VC++6.0编译出来的程序需要在未安装VS/VC++6.0的电脑上跑,很大情况会出现MSVCRXXX.dll 或者其他DLL丢失的情形,本篇就DLL相关问题做个记录. 二.正文 1 ...
- VC++6.0 Win32 C2065:SM_XVIRTUALSCREEN
百度了了一大堆,都说让重装vc++6.0,然而并没有什么卵用. 解决办法:找到你的vc6.0安装路径下的WINDOWS.H,将0x0400改为0x0500 Window各个版本对应的宏值WINVER:
- VC++6.0文件关联问题的解决方法
最近我的电脑*.c文件关联失败,无法实现双击*.c打开vc++6.0,感觉特别不爽. 在经过自己的琢磨研究后,终于找到了解决方法. 特此分享下,希望可以帮到遇到同样问题的你. 核心内容: 1.& ...
- VC++6.0 配置CppUTest测试环境
最近看<软件项目成功之道>,书中无数次提及到“单元测试”对于项目成败的重要性,看到同事将CppUTest用于Linux动态库测试,于是在VC++6.0环境下搭建一个基于CppUTest的单 ...
- 解决libcurl7.50.3在windows XP SP3 VC++ 6.0下编译报错 unresolved external symbol __imp__IdnToAscii@20 unresolved external symbol __imp__IdnToUnicode@20
错误重现: --------------------Configuration: curl - Win32 LIB Debug DLL Windows SSPI DLL WinIDN--------- ...
- vc++6.0各种报错合集(附:VC++6.0调出打印窗口的方法)
背景: 由于VC++6.0对于现在的我来说,只是一个工具,暂时没有太多的时间分配到这块去深究它,由于不明其原理,因此也只是在此把错误积累下来,以备下次相同错误出现时能快速排除,节省时间. 正文 一.出 ...
- VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)
背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...
- VC++ 6.0使用定时器SetTimer;
背景: windows中使用VC++6.0制作了个交互界面向下位机定时发送数据及显示下位机上传的数据.定时发送则需要使用定时器. 本文只做记录如何调用,原理以后再深究. 正文: 首先,我生成的窗体类名 ...
- VC++6.0使用OpenGL前的配置(必看)
要在VC++6.0中使用opengl,需要配置一下环境设置. 具体需要两步: 1.加入一个头文件,两个lib文件,两个dll文件,放在合适位置. 2.配置一下vc++6.0的Project Setti ...
随机推荐
- kettle mogodb output详解
以下主要来自官网文档,原文:https://wiki.pentaho.com/display/EAI/MongoDB+Output Configure Connection Tab 1 Host na ...
- HTML <a> 标签的 href 属性_定位资源
* 定位资源 ** 如果想要定位资源:定义一个位置 <a name="top">顶部</a> ** 回到这个位置 <a href="#top ...
- iptable规则的执行顺序
众所周知,iptable的中包含了各种各样的table和规则链条.这篇博文对规则链的执行顺序做一个简单的介绍. Chain OUTPUT (policy ACCEPT)target prot opt ...
- DS1302时钟基础使用(含代码)
了解其管脚 X1 X2 32.768KHz 晶振管脚 GND 地 RST 复位脚 I/O 数据输入/输出引脚,具有三态 SCLK 串行时钟 Vcc1,Vcc2(备用电源供电) 电源供电管脚 DS130 ...
- curl and wget
写在前面: a. 对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url 直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...
- linux中查找命令find、locate、whereis、which、type的区别
find find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/var/lib/locatedb)文件不同,find查找的是磁盘空间. locate locate命令其实 ...
- 【并行计算-CUDA开发】CUDA存储器模型
CUDA存储器模型 除了执行模型以外,CUDA也规定了存储器模型(如图2所示)和一系列用于主控CPU与GPU间通信的不同地址空间.图中红色的区域表示GPU片内的高速存储器,橙色区域表示DRAM中的的地 ...
- 【VS开发】关于线程安全一些细节体会
[VS开发]关于线程安全一些细节体会 标签(空格分隔): [VS开发] 利用C++进行GUI界面开发,最大的问题往往是多线程安全问题,由于C++不具备收集内存垃圾的功能,所以必须由程序员负责维护,因此 ...
- [转帖]yum与apt-get的区别以及两者更新源(阿里/网易【163】)
yum与apt-get的区别以及两者更新源(阿里/网易[163]) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/one_super_dreamer ...
- provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.
通常情况下,要解决这个,你去SQL Server配置管理器(SSCM)和: [1]在SSCM中设置 [1.1]确保共享内存协议启用 [1.2]确保命名管道协议 [1.3]确保TCP / IP被启用,和 ...