SokcetClient c++

Posted zclaude

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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!\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 != -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\"\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 != -1)
    
        int rs = -1;
        int resultRecv = -1;
        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 = 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, \0, 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\"\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 != -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_

 

以上是关于SokcetClient c++的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp tcp client.c

c_cpp client_tcp_epoll.c

sigpipe c server/client - 程序在哪里重新启动?

编写设备驱动之i2c_client

cmake:VS2015和GCC编译paho.mqtt C/C++ client

ipfs c++client