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等等相关的知识 ...
随机推荐
- Python学习【day02】- Python基础练习题
#!/usr/bin/env python # -*- coding:utf8 -*- # 执行Python 脚本的两种方式 # 答:①在windows的cmd窗口下 > D:/Python/p ...
- 错误:编码GBK的不可映射字符解决办法
今天在cmd测试java代码的时候遇到了一个错误 解决办法: 输入javac -encoding utf-8 文件名.java 原因: 由于JDK是国际版的,我们在用javac编译时,编译程序首 ...
- js执行多次事件,而非一次
晚上查阅了很多文章,都是避免点击事件多次执行.反过来要是让事件多次执行该如何做? 这里可以配个setTimeout():来执行 这里我们用layui <link rel="styles ...
- 多表表与表关系 增删改查 admin
今日内容 多表表与表关系 增删改查表数据 admin 多表操作 表与表关系 默认指向主键 可能是隐藏主键 djamgo1.1默认级联(models. SET NULL解除级联) 一对一 先建立少的一方 ...
- Filebeat7 Kafka Gunicorn Flask Web应用程序日志采集
本文的内容 如何用filebeat kafka es做一个好用,好管理的日志收集工具 放弃logstash,使用elastic pipeline gunicron日志格式与filebeat/es配置 ...
- the Percentage Layout of Android (安卓的百分比布局)
不用wrap_content.match_parent来指定 控件的大小, 1.在app/bulid.gradle文件的dependencies中添加 compile 'com.android.sup ...
- HTML5的新变化
1.新的html5文件类型,仅需申明在html的第一行,即 <!DOCTYPE html> 2.图形元素 figure ,将<figure>与<figcaption> ...
- vscode中外部引入js文件以及里面相应的方法
随便写一个js文件,定义一个方法名,并且在组件中进行引用就算成功 ###~js function shuchu(){ console.log(1) } export { shuchu }; ...
- spring cloud 入门
某种程度上 软硬件 殊途同归了 (软件模仿硬件 总线设计, 资源定位 (寻址) ) spring 是什么 EDA ( Event-driven architecture ) (SOA , SOAP , ...
- 微信支付成功没有回调遇到的坑 onBridgeReady getBrandWCPayRequest wx.chooseWXPay
最近在调微信支付,遇到一个问题,就是支付成功回调不执行的. 遇到的问题就是 苹果手机 支付成功没有进到回调函数里,但是支付的时候,点击取消支付是可以进到回调函数里的. 安卓手机测试一切正常! ...