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 = ;
char szHost[] = "192.168.5.7";
int nPort = ; CTcpSocket tmpTcp;
iRet = tmpTcp.ConnectServer(szHost,nPort);
if(iRet < )
{
printf("ConnectServer IP = %s, port = %d failed\n",szHost,nPort);
}
return ;
} int CTcpSocket :: ConnectServer(const char*szHost,long port)
{
int iRet = -;
int iFlag = ;
int iLen = ;
char sendBuf[];
unsigned char reveBuf[];
int iDataNum;
bool m_flag;
do
{
if(NULL == szHost)
{
break;
}
clientSock = socket(AF_INET,SOCK_STREAM,);
if(clientSock < )
{
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 < )
{
perror("connect\n");
return ;
}
else
{
printf("ConnectServer IP = %s, port = %ld sucess\n",szHost,port);
}
if(m_bIsConnected)
{
iRet = ;
break;
} m_bIsConnected = true; m_flag = false;
while(!m_flag)
{
iRet = sendMessage();
if(iRet > ) m_flag = true;
} m_flag = false;
while(!m_flag)
{
iRet = recvMessage();
if(iRet > ) m_flag = true;
} }while( == iFlag);
close(clientSock);
return iRet;
} //class CTcpSocket
CTcpSocket::CTcpSocket(void)
{
//m_ConnAddr = -1;
clientSock = -;
isRev = true;
m_bIsConnected = false;
} CTcpSocket::~CTcpSocket(void)
{
Disconnect();
} void CTcpSocket::Disconnect()
{
close(clientSock);
clientSock = -;
isRev = false;
} int CTcpSocket::sendMessage()
{
int iRet ;
char szSendbuf[];
sprintf(szSendbuf,"01 03 09 00 00 06 C6 54");
if(m_bIsConnected)
{
iRet = send(clientSock,szSendbuf,sizeof(szSendbuf),);
if(iRet > )
{
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[];
iRet = recv(clientSock,szRecvbuf,sizeof(szRecvbuf),);
szRecvbuf[iRet] = ;
if(m_bIsConnected)
{
if(iRet < )
{
printf("recv data failed\n");
}
else
{
printf("recv %d data success\n",iRet);
int iDataNum = ;
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
程序运行结果:
运行结果需要用服务器程序互相通信或者使用模拟软件来互相通信。
此处不展示了。
linux环境下C++写TCP通信(一)的更多相关文章
- 关于ARP攻击的原理以及在Kali Linux环境下的实现
关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...
- 【转载】linux环境下tcpdump源代码分析
linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02 CSDN博客 原文链接 http://blog.csdn.net/han_dawei/article/d ...
- linux环境下tcpdump源代码分析
Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...
- 由一个简单需求到Linux环境下的syslog、unix domain socket
本文记录了因为一个简单的日志需求,继而对linux环境下syslog.rsyslog.unix domain socket的学习.本文关注使用层面,并不涉及rsyslog的实现原理,感兴趣的读者可以参 ...
- 多线程编程之Linux环境下的多线程(二)
上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...
- [原]对Linux环境下任务调度一点认识
我一直以来有一个误解,那就是在终端运行某个程序时,按下Ctrl + D时我误以为就是杀死了这个进程,今天才知道原来不是.比如我利用libevent在Linux环境下写了一个网络监听程序,当启动程序之后 ...
- Linux环境下发布.net core
一.安装Linux环境 1. 安装VM虚拟机和操作系统 VM虚拟工具安装的过程详见:http://blog.csdn.net/stpeace/article/details/78598333.直接按照 ...
- Memcached在Linux环境下的使用详解
一.引言 写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完了,从安装到数据类型,在到集群,几乎都写到了.如果以后有了心得,再补充吧.然后就 ...
- Linux环境下Hadoop集群搭建
Linux环境下Hadoop集群搭建 前言: 最近来到了武汉大学,在这里开始了我的研究生生涯.昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识 ...
随机推荐
- Git 实习一个月恍然大悟合集
从开始实习到现在大概有一个月了,这个月时间接触了很多新东西,其中就包括了git版本控制.分支管理等等.我在这段时间里,深深地感受到了git对公司项目代码管理和控制.团队合作带来的益处和其重要性.其实在 ...
- 牛客 545C 出题人的数组 (贪心)
出题人有两个数组A,B,请你把两个数组归并起来使得$cost=\sum i c_i$最小. 归并要求原数组的数的顺序在新数组中不改变. 贪心水题 对于一段序列$A_i,A_{i+1},...,A_r$ ...
- MySQL性能优化(一):优化方式
原文:MySQL性能优化(一):优化方式 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/v ...
- PC端微信扫码支付和支付宝跳转支付
import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; impo ...
- Charles学习(二)之使用Map local代理本地静态资源以及配置网页代理在Mac浏览器上调试移动端
前言 我们在开发的过程肯定是一边写代码,一边查看自己的代码写的是否存在问题,那么问题来了,有两种情况 情况一:我们可以本地起服务,那么我们就可以在本地检查自己的代码,查看运行结果 情况二:本地无法起服 ...
- SQL这样干,你就是给自己刨坑.....
SQL是作为一个程序员接触得非常多的一种语言,但是,很多时候,我们会发现,有些SQL的执行效率异常的差,造成了数据库的负担.我们通过分析这些有问题的SQL,就可以发现很多我们平时在写SQL的时候忽略的 ...
- JavaScript金字塔打印
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- kinit: Bad encryption type while getting initial credentials
描述:RHEL 6.x主机执行kinit -kt命令报如下错误 [heboan@localhost~]$ kinit -kt heboan.keytab heboan kinit: Bad encry ...
- 正确的安装和使用nvm(mac)<转>
前言 目前主流的node版本管理工具有两种,nvm和n.两者差异挺大的,具体分析可以参考一下淘宝FED团队的一篇文章: 管理 node 版本,选择 nvm 还是 n? 总的来说,nvm有点类似于 Py ...
- poj 1007 DNA sorting (qsort)
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 95209 Accepted: 38311 Des ...