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
程序运行结果:
运行结果需要用服务器程序互相通信或者使用模拟软件来互相通信。
此处不展示了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于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)