// 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;
}

最新文章

  1. Html标签的语义化
  2. 2.简单的Code First例子(EF Code-First系列)
  3. TripleDES加解密Java、C#、php通用代码
  4. POJ 2492 A Bug&#39;s Life
  5. javascript动态添加一组input
  6. 多次绑定DataGridView的DataSource会报错 NullReferenceExcepti
  7. [PHP]如何在百度(BAE)和新浪(SAE)的云平台使用PHP连接MySQL并返回结果数据
  8. Java web 项目 tomcat部署方式.
  9. 关于谷歌浏览器下自动填写密码的bug
  10. index full scan/index fast full scan/index range scan
  11. npm常用命令总结
  12. JVM调优总结(九)-新一代的垃圾回收算法
  13. 在QComboBox的基础上实现复选功能
  14. 指定时间生成cron表达式
  15. AtCoder Regular Contest 090
  16. 查询tensorflow中的函数用法
  17. Concurrency in C# Cookbook 笔记
  18. POI2015 解题报告
  19. ASP.NET MVC下使用AngularJs语言(三):ng-options
  20. FIS.js前端开发的使用说明文档

热门文章

  1. php+UEditor粘贴word
  2. Kettle 排序记录的使用(Sort rows)
  3. ORACLE11G报错汇总
  4. mysql查看系统参数
  5. pod installation failed with react native 0.44
  6. Vue 组件中 data 为什么必须是函数
  7. 【VS开发】【DSP开发】如何使用WinDriver为PCIe采集卡装驱动
  8. 2019牛客暑期多校训练营(第七场)-H Pair(数位dp)
  9. 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别
  10. PHP中各种强大的函数