#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通信(一)的更多相关文章

  1. 关于ARP攻击的原理以及在Kali Linux环境下的实现

    关于ARP攻击的原理以及在Kali Linux环境下的实现 全文摘要 本文讲述内容分为两部分,前半部分讲述ARP协议及ARP攻击原理,后半部分讲述在Kali Linux环境下如何实现ARP攻击以及AR ...

  2. 【转载】linux环境下tcpdump源代码分析

    linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02  CSDN博客 原文链接  http://blog.csdn.net/han_dawei/article/d ...

  3. linux环境下tcpdump源代码分析

    Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...

  4. 由一个简单需求到Linux环境下的syslog、unix domain socket

    本文记录了因为一个简单的日志需求,继而对linux环境下syslog.rsyslog.unix domain socket的学习.本文关注使用层面,并不涉及rsyslog的实现原理,感兴趣的读者可以参 ...

  5. 多线程编程之Linux环境下的多线程(二)

    上一篇文章中主要讲解了Linux环境下多线程的基本概念和特性,本文将说明Linux环境下多线程的同步方式. 在<UNIX环境高级编程>第二版的“第11章 线程”中,提到了类UNIX系统中的 ...

  6. [原]对Linux环境下任务调度一点认识

    我一直以来有一个误解,那就是在终端运行某个程序时,按下Ctrl + D时我误以为就是杀死了这个进程,今天才知道原来不是.比如我利用libevent在Linux环境下写了一个网络监听程序,当启动程序之后 ...

  7. Linux环境下发布.net core

    一.安装Linux环境 1. 安装VM虚拟机和操作系统 VM虚拟工具安装的过程详见:http://blog.csdn.net/stpeace/article/details/78598333.直接按照 ...

  8. Memcached在Linux环境下的使用详解

    一.引言             写有关NoSQL数据库有关的文章已经有一段时间了,可以高兴的说,Redis暂时就算写完了,从安装到数据类型,在到集群,几乎都写到了.如果以后有了心得,再补充吧.然后就 ...

  9. Linux环境下Hadoop集群搭建

    Linux环境下Hadoop集群搭建 前言: 最近来到了武汉大学,在这里开始了我的研究生生涯.昨天通过学长们的耐心培训,了解了Hadoop,Hdfs,Hive,Hbase,MangoDB等等相关的知识 ...

随机推荐

  1. PreparedStatement 以及事务的注意事项

    a).PreparedStatement 可以进行批量操作,但是与Statement有一定的区别 1. Statement可以进行不同sql语句的批量操作 即可以同时进行 crud 操作. Strin ...

  2. 如何实现一个简化版的 jQuery

    对于操作 DOM 来说,jQuery 是非常方便的一个库,虽然如今随着 React, Vue 之类框架的流行,jQuery 用得越来越少了,但是其中很多思想还是非常值得我们学习的,这篇文章将介绍如何从 ...

  3. css中的position 的absolute和relative的区别(转)

    我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...

  4. softmax函数笔记

  5. MySQL 下载与安装

    从MySQL官网下载安装文件,我的电脑是window10 64位的,下载社区版本,选择mysql community server,再下载64位的. 官网链接:https://www.mysql.co ...

  6. 【Groovy】 Groovy笔记

    一.简单了解Groovy Groovy简介: Groovy是基于JVM的敏捷开发语言,语法与Java类似,但更加简洁,容错性也比Java强,同时Java能非常好的契合(例如Groovy能够使用Java ...

  7. SpringMVC @Valid,@RequestBody,@RequestParam标注参数时,进行Postman测试

    @Valid(post请求) 可与@RequestBody一起使用 > (@RequestBody @Valid User user) @RequestBody(post请求) 这里的requi ...

  8. linux系统使用grep命令提取文件的基名或者路径名

    效果等于~]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 echo "/etc/sysconfig/network-scripts/ ...

  9. Summer training round2 #8(Training26)

    A:贪心DFS 先从最远的搜起 如果一个点的value>=2 就ans++ D:并查集 E:大模拟 F:快速幂 #include <bits/stdc++.h> using name ...

  10. spark源码本地调试

    1.前提条件: 1)安装jdk 版本: 2)安装scala 版本: 3)安装sbt 版本: 4)安装maven 5)安装git 版本: 6)安装idea,并配置好sbt.git.maven 2.从gi ...