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等等相关的知识 ...
随机推荐
- split、paste命令
一.split分割文件 语法 split [OPTION] ... [INPUT [PREFIX]] 描述 将固定大小的INPUT输出到PREFIXaa,PREFIXab,.. ...
- C++ 多态、虚函数(virtual 关键字)、静态联编、动态联编
函数重写:(在子类中重写父类中的函数) 父类中被重写的函数 依然会继承 给子类. 子类中重写的函数将覆盖父类中的函数. 通过作用域分辨符 :: 可以访问到父类中的函数. 例如: #includ ...
- golang(1):简介
golang语言特性: 1. 垃圾回收 a. 内存自动回收,不需要开发人员管理内存,开发人员专注业务实现 b. 只需要new分配内存,不需要释放 2. 天然并发 a. 从语言层面支持并发,非常简单 b ...
- RBAC(基于角色的访问控制)用户权限管理数据库设计
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- 大型分布式爬虫准备 scrapy + request
那些高手 爬虫好文 而我避免这些问题的方式,控制台清除所有定时 var id = setInterval(function() {}, 0); while (id--) clearInterval(i ...
- 多线程编程-- part 5.2 JUC锁之Condition条件
1.Condition介绍 Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当 ...
- RabbitMQ核心技术总结
RabbitMQ和kafka类似,也是一个消息服务.RabbitMQ是轻量级的,易于部署在内部和云端.RabbitMQ支持多种消息协议,可以部署在分布式集群中,能够满足高规模,高可用性要求.Rabbi ...
- 第十篇.5、python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- Ubuntu中用bitbake core-image-minimal时,出错:from bb import data
问题描述: 在准备ARM交叉编译环境时,执行完命令: DISTRO=fsl-imx-x11 MACHINE=imx6qsabresd source fsl-setup-release.sh -b bu ...
- poj 1007 DNA sorting (qsort)
DNA Sorting Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 95209 Accepted: 38311 Des ...