zoukankan      html  css  js  c++  java
  • SokcetClient c++

    #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 = -1;
        WSADATA wsaData;
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
            std::cout << "Socket版本加载失败" << std::endl;
    }
    
    
    SokcetClient::~SokcetClient()
    {
        closeSocket();
    }
    
    void SokcetClient::closeSocket()
    {
        if (m_nLocalSocket != -1)
            closesocket(m_nLocalSocket);    //关闭socket连接
    
        m_nLocalSocket = -1;
        WSACleanup();    //终止ws2_32.lib的使用
    }
    
    //创建一个socket
    bool SokcetClient::createSocket()
    {
        if (m_nLocalSocket == -1)
        {    
            /*
            int iMode = 1;
            WSADATA wsd;
            
            //初始化Socket环境
            if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
            {
                outputMessage("WSAStartup failed!
    ");
    
            }
            */
            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 != -1)
        {
            sockaddr_in m_nServeraddr;
            memset(&m_nServeraddr, 0, 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"}
    ";
            //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 != -1)
        {
            int rs = -1;
            int resultRecv = -1;
            fd_set rfds;
            while (true)
            {
            
                int size = sizeof(m_message);
                memset(m_message, '', size);
                FD_ZERO(&rfds);
                FD_SET(m_nLocalSocket, &rfds);
                struct timeval tv;
                tv.tv_sec = 2;
                tv.tv_usec = 0;
                rs = select(m_nLocalSocket, &rfds, NULL, NULL, 0);
                if (rs > 0) 
                {
                    resultRecv = recv(m_nLocalSocket, m_message, size, 0);
                    if (resultRecv > 0)
                    {
                        HeartBeatResponse heartBeatResponse;
                        x2struct::X::loadjson(m_message, heartBeatResponse, false);
                        string json = x2struct::X::tojson(heartBeatResponse);
    
    
                        //输出消息
                        outputMessage(json.c_str());
    
                        memset(m_message, '', size);
    
                    }
                    else
                    {
                        //这几种错误码,认为连接是正常的,继续接收
                        if ((resultRecv < 0) && (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"}
    ";
            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 ...
    ");
                    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'
    ",
                            heartbeat, errno, strerror(errno));
                        break;
                    }
                    else
                    {
                        printf("News: %s 	 send, sent a total of %d bytes!
    ",
                            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
    ",
                                buffer, len);
                        }
                        else
                        {
                            if (len < 0)
                                printf("Failed to receive the message! 
                        The error code is %d, error message is '%s'
    ",
                                    errno, strerror(errno));
                            else
                                printf("Chat to terminate!
    ");
    
    
                            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!
    ");
                            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'
    ",
                                buffer, errno, strerror(errno));
                            break;
                        }
                        else
                        {
                            printf("News: %s 	 send, sent a total of %d bytes!
    ",
                                buffer, len);
                        }
                    }
                }
            }*/
        }
        else
        {
            outputMessage("当前与服务器未连接!");
        }
    }
    
    void SokcetClient::Mysend(const char* buffer)
    {
        if (m_nLocalSocket != -1)
        {
            int size = strlen(buffer);
            send(m_nLocalSocket, buffer, size, 0);
        }
        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[1024];
    };
    
    
    #endif _SOCKETCLIENT_H_
  • 相关阅读:
    进程管理
    磁盘管理
    用户组管理
    Idea 导入(import)项目和打开(open)项目的区别
    SqlServer--转换varchr值‘2993296307’时溢出了整数列 和 修改 字段类型
    C#--Winform--图标控件Chart详解
    SqlServer--存储过程--自定义存储过程
    SqlServer--存储过程--系统和扩展存储过程(不常用)
    SqlServer--视图
    C#--SqlServer--sql语句拼接和带参数的SQL语句
  • 原文地址:https://www.cnblogs.com/zclaude/p/11628279.html
Copyright © 2011-2022 走看看