#include "pch.h"
#include "SokcetClient.h"
#include <iostream>
#include <thread>
#include <Ws2tcpip.h>
#include "StringHelper.h"
#include "HeartBeatResponse.h"
#include "x2struct/x2struct.hpp"
#include <string.h>
#include <stdio.h> SokcetClient::SokcetClient()
{
m_nLocalSocket = -;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(, ), &wsaData) != )
std::cout << "Socket版本加载失败" << std::endl;
} SokcetClient::~SokcetClient()
{
closeSocket();
} void SokcetClient::closeSocket()
{
if (m_nLocalSocket != -)
closesocket(m_nLocalSocket); //关闭socket连接 m_nLocalSocket = -;
WSACleanup(); //终止ws2_32.lib的使用
} //创建一个socket
bool SokcetClient::createSocket()
{
if (m_nLocalSocket == -)
{
/*
int iMode = 1;
WSADATA wsd; //初始化Socket环境
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
outputMessage("WSAStartup failed!\n"); }
*/
m_nLocalSocket = socket(AF_INET, SOCK_STREAM , IPPROTO_TCP);
if (m_nLocalSocket != INVALID_SOCKET)
{
outputMessage(StringHelper::GBKToUTF8("客服端socket创建成功").c_str()); }
/*
//调用ioctlsocket()将其设置为非阻塞模式
int retVal = ioctlsocket(m_nLocalSocket, FIONBIO, (u_long FAR*)&iMode);
if (retVal == SOCKET_ERROR)
{
outputMessage("ioctlsocket failed!");
WSACleanup();
}*/ } return false;
} bool SokcetClient::Myconnect(const char* ip, const unsigned short prot)
{
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(prot);
m_nServeraddr.sin_addr.s_addr = inet_addr(ip); nRet = connect(m_nLocalSocket, (sockaddr*)&m_nServeraddr, sizeof(m_nServeraddr));//成功返回0。否则返回SOCKET_ERROR if (nRet == SOCKET_ERROR)
{
outputMessage("服务器连接失败!");
return false;
} outputMessage("服务器连接成功!");
//std::string data ="{\"bizCode\":\"B1001\",\"parkingNo\":\"1000000184\",\"clientNo\":\"1\",\"reqNo\":\"201909291613278736\",\"clientName\":\"大门岗亭\",\"sign\":\"57DCE7C04A3EF22BF2305281A98A57B2\"}\n\0";
//std::string strTemp = StringHelper::GBKToUTF8(data);
//outputMessage(data.c_str());
//Mysend(strTemp.c_str());
//Myrecv(); return true;
} return false;
} void SokcetClient::Myrecv()
{ if (m_nLocalSocket != -)
{
int rs = -;
int resultRecv = -;
fd_set rfds;
while (true)
{ int size = sizeof(m_message);
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, );
if (rs > )
{
resultRecv = recv(m_nLocalSocket, m_message, size, );
if (resultRecv > )
{
HeartBeatResponse heartBeatResponse;
x2struct::X::loadjson(m_message, heartBeatResponse, false);
string json = x2struct::X::tojson(heartBeatResponse); //输出消息
outputMessage(json.c_str()); memset(m_message, '\0', size); }
else
{
//这几种错误码,认为连接是正常的,继续接收
if ((resultRecv < ) && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR))
{
continue;//继续接收数据
}
//outputMessage("与服务器连接中断!");
//break;//跳出接收循环
}
}
}
/*
#define MAXBUF 1024
int len; char buffer[MAXBUF]; char heartbeat[2048] = "{\"bizCode\":\"B1001\",\"parkingNo\":\"1000000184\",\"clientNo\":\"1\",\"reqNo\":\"201909291613278736\",\"clientName\":\"大门岗亭\",\"sign\":\"57DCE7C04A3EF22BF2305281A98A57B2\"}\n";
fd_set rfds;
struct timeval tv;
int retval, maxfd = -1;
while (1)
{
FD_ZERO(&rfds);
FD_SET(0, &rfds);
maxfd = 0; FD_SET(m_nLocalSocket, &rfds);
if (m_nLocalSocket > maxfd)
maxfd = m_nLocalSocket; tv.tv_sec = 2;
tv.tv_usec = 0; retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
if (retval == -1)
{
printf("Will exit and the select is error! %s", strerror(errno));
break;
}
else if (retval == 0)
{
//printf("No message comes, no buttons, continue to wait ...\n");
len = send(m_nLocalSocket, heartbeat, strlen(heartbeat), 0);
if (len < 0)
{
printf("Message '%s' failed to send ! \
The error code is %d, error message '%s'\n",
heartbeat, errno, strerror(errno));
break;
}
else
{
printf("News: %s \t send, sent a total of %d bytes!\n",
heartbeat, len);
} continue;
}
else
{
if (FD_ISSET(m_nLocalSocket, &rfds))
{
memset(buffer, 0,MAXBUF + 1);
len = recv(m_nLocalSocket, buffer, MAXBUF, 0); if (len > 0)
{
printf("Successfully received the message: '%s',%d bytes of data\n",
buffer, len);
}
else
{
if (len < 0)
printf("Failed to receive the message! \
The error code is %d, error message is '%s'\n",
errno, strerror(errno));
else
printf("Chat to terminate!\n"); break;
}
} if (FD_ISSET(0, &rfds))
{
memset(buffer,0, MAXBUF + 1);
fgets(buffer, MAXBUF, stdin); if (!strncmp(buffer, "quit", 4))
{
printf("Own request to terminate the chat!\n");
break;
} len = send(m_nLocalSocket, buffer, strlen(buffer) - 1, 0);
if (len < 0)
{
printf("Message '%s' failed to send ! \
The error code is %d, error message '%s'\n",
buffer, errno, strerror(errno));
break;
}
else
{
printf("News: %s \t send, sent a total of %d bytes!\n",
buffer, len);
}
}
}
}*/
}
else
{
outputMessage("当前与服务器未连接!");
}
} void SokcetClient::Mysend(const char* buffer)
{
if (m_nLocalSocket != -)
{
int size = strlen(buffer);
send(m_nLocalSocket, buffer, size, );
}
else
{
outputMessage("当前与服务器未连接");
}
} void SokcetClient::outputMessage(const char * outstr)
{
std::cout << outstr << std::endl;
}
#pragma once

#ifndef _SOCKETCLIENT_H_
#define _SOCKETCLIENT_H_ #include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib") //加载 ws2_32.dll class SokcetClient
{
public:
SokcetClient();
~SokcetClient(); bool createSocket();
void closeSocket(); bool Myconnect(const char* ip, const unsigned short prot);
void Mysend(const char* buffer);
void Myrecv(); void outputMessage(const char* outstr); private:
SOCKET m_nLocalSocket;
char m_message[];
}; #endif _SOCKETCLIENT_H_

SokcetClient c++的更多相关文章

  1. SokcetClient VC++6.0

    // SokcetClient.cpp: implementation of the SokcetClient class. // ////////////////////////////////// ...

随机推荐

  1. rsync+inotify实时数据同步

    没有实际的用过,先mark一下,后面实践. https://www.osyunwei.com/archives/7447.html 一.为什么要用Rsync+sersync架构? 1.sersync是 ...

  2. PO BAPI "BAPI_PO_CREATE1"

    DATA: poheader LIKE  bapimepoheader,         poheaderx LIKE  bapimepoheaderx,         poitem  LIKE   ...

  3. 阿里云Centos7挂载数据盘

    查看磁盘情况 fdisk -l fdisk /dev/vdb 根据提示,分别输入 n. p. . enter.enter.wq fdisk -l mkfs.ext3 /dev/vdb1 挂载磁盘,写入 ...

  4. Python之Numpy:二元函数绘制/三维数据可视化/3D

    意义 在机器学习任务中选择计算模型或者学习数学时,可视化有助于研究函数值的变化趋势(观察收敛.分布.几何形状等),带来直观的感受. 源码 # 绘制二元函数 # 参考文献 # + python画二元函数 ...

  5. .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控

    前言 .net core 2.* 实施性能监控 这个工具其实给运维 大大们用起来是更爽的.但是Grafana现在还没有找到中文版. 本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库, ...

  6. vscode中如何加eslint检查工具

    代码的质量对开发人员个人的成长以及公司的发展至关重要,所以如何使用把控代码的质量是大家经常思考的问题.除了代码审核之外,代码检查工具成了把控代码质量的第一道门槛,非常好用,可以建立一些团队约定的代码风 ...

  7. AFNetworking网址中有中文崩溃的问题

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSe ...

  8. SpringBoot简历模板

    项目二:智慧学习-乐勤在线学习网(SpringBoot)◎ 开发模式:团队(8人)                 ◎ 开发周期:4个月◎ 开发环境:JDK1.8.Zookeeper        ◎ ...

  9. python装饰器使用详解

    装饰器 '''装饰器:就是闭包(闭包的一个应用场景) -- 把要被装饰的函数作为外层函数的参数通过闭包操作后返回一个替代版函数 优点: -- 丰富了原有函数的功能 -- 提高了程序的可拓展性''' 开 ...

  10. python中 __file__的小坑坑

    在python脚本中,我们难免会需要用到自身文件所在的绝对路径,第一想法可能就是用os.path.dirname(__file__) 但是这里有个大坑,我就踩了,这种方式得到路径会出现问题,脚本执行报 ...