linux环境下C++写TCP通信(一)

复制代码
#include<stdio.h>
#include<string.h>
//tcp
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<errno.h>
//endtcp

class CTcpSocket
{
    public:
        CTcpSocket(void);
        virtual ~CTcpSocket(void);
        int ConnectServer(const char*szHost,long port);
        void Disconnect();
        
        int sendMessage();
        int recvMessage();
    private:
        struct sockaddr_in m_ConnAddr;
        int clientSock;
        bool isRev;
        bool m_bIsConnected;
};

class TCPModbusChannel
{
    public:
        TCPModbusChannel();
        ~TCPModbusChannel();

        CTcpSocket tmpTCPobj;        

        bool GetTransducerData();
        int ReadHldReg();
        int ProcessTransducerReceivedRTU();
};

int main()
{
    printf("Transducer Version 1.1\n");
    int iRet = 0;
    char szHost[256] = "192.168.5.7";
    int nPort = 26;    

    CTcpSocket tmpTcp;
    iRet = tmpTcp.ConnectServer(szHost,nPort);
    if(iRet < 0)
    {
        printf("ConnectServer IP = %s, port = %d failed\n",szHost,nPort);
    }
    return 0;
}

int CTcpSocket :: ConnectServer(const char*szHost,long port)
{
    int iRet = -1;
    int iFlag = 0;
    int iLen = 0;
    char sendBuf[256];
    unsigned char reveBuf[256];
    int iDataNum;
    bool m_flag;
    do
    {
        if(NULL == szHost)
        {
            break;
        }        
        clientSock = socket(AF_INET,SOCK_STREAM,0);
        if(clientSock < 0)
        {
            perror("sock\n");
        }
        m_ConnAddr.sin_family = AF_INET;
        m_ConnAddr.sin_port = htons(port);
        m_ConnAddr.sin_addr.s_addr = inet_addr(szHost);

        iLen = sizeof(m_ConnAddr);
        iRet = connect(clientSock,(struct sockaddr *)&m_ConnAddr,iLen);
        if(iRet < 0)
        {
            perror("connect\n");
            return 1;
        }
        else
        {
            printf("ConnectServer IP = %s, port = %ld sucess\n",szHost,port);
        }
        if(m_bIsConnected)
        {
            iRet = 1;
            break;
        }

        m_bIsConnected = true;

        m_flag = false;
        while(!m_flag)
        {
            iRet = sendMessage();
            if(iRet > 0) m_flag = true;
        }
        
        m_flag = false;
        while(!m_flag)
        {
            iRet = recvMessage();
            if(iRet > 0) m_flag = true;
        }
        
    }while(1 == iFlag);
    close(clientSock);
    return iRet;
}


//class CTcpSocket
CTcpSocket::CTcpSocket(void)
{
        //m_ConnAddr = -1;
        clientSock = -1;
        isRev = true;
        m_bIsConnected = false;
}

CTcpSocket::~CTcpSocket(void)
{
        Disconnect();
}

void CTcpSocket::Disconnect()
{
    close(clientSock);
    clientSock = -1;
    isRev = false;
}

int CTcpSocket::sendMessage()
{
    int iRet ;
    char szSendbuf[256];
    sprintf(szSendbuf,"01 03 09 00 00 06 C6 54");
    if(m_bIsConnected)
    {
        iRet = send(clientSock,szSendbuf,sizeof(szSendbuf),0);
        if(iRet > 0)
        {
            printf("send message %s success\n",szSendbuf);
        }
        else
        {
            printf("send message %s failed\n",szSendbuf);
        }
    }
    return iRet;
}

int CTcpSocket::recvMessage()
{
    int iRet;
    unsigned char szRecvbuf[256];
    iRet = recv(clientSock,szRecvbuf,sizeof(szRecvbuf),0);
    szRecvbuf[iRet] = 0;
    if(m_bIsConnected)
    {
        if(iRet < 0)
        {
            printf("recv data failed\n");
        }
        else
        {
            printf("recv %d data  success\n",iRet);    
            int iDataNum = 0;
            while(szRecvbuf[iDataNum])
            {
                printf("%02X ",szRecvbuf[iDataNum++]);
            }
            printf("\n");
        }
    }
    return iRet;
}

//end  class CTcpSocket
复制代码

makefile文件:

test: test.o
    g++ test.o -o test
test.o : test.cpp
    g++ -c test.cpp 

clean:
    rm  test.o test

make结果:

exbot@ubuntu:~/wangqinghe/Transducer/20190611$ make
g++ -c test.cpp
g++ test.o -o test

程序运行结果:

运行结果需要用服务器程序互相通信或者使用模拟软件来互相通信。

此处不展示了。

posted @   王清河  阅读(3197)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示