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等等相关的知识 ...
随机推荐
- PreparedStatement 以及事务的注意事项
a).PreparedStatement 可以进行批量操作,但是与Statement有一定的区别 1. Statement可以进行不同sql语句的批量操作 即可以同时进行 crud 操作. Strin ...
- 如何实现一个简化版的 jQuery
对于操作 DOM 来说,jQuery 是非常方便的一个库,虽然如今随着 React, Vue 之类框架的流行,jQuery 用得越来越少了,但是其中很多思想还是非常值得我们学习的,这篇文章将介绍如何从 ...
- css中的position 的absolute和relative的区别(转)
我们先来看看CSS3 Api中对position属性的相关定义: static:无特殊定位,对象遵循正常文档流.top,right,bottom,left等属性不会被应用. relative:对象遵循 ...
- softmax函数笔记
- MySQL 下载与安装
从MySQL官网下载安装文件,我的电脑是window10 64位的,下载社区版本,选择mysql community server,再下载64位的. 官网链接:https://www.mysql.co ...
- 【Groovy】 Groovy笔记
一.简单了解Groovy Groovy简介: Groovy是基于JVM的敏捷开发语言,语法与Java类似,但更加简洁,容错性也比Java强,同时Java能非常好的契合(例如Groovy能够使用Java ...
- SpringMVC @Valid,@RequestBody,@RequestParam标注参数时,进行Postman测试
@Valid(post请求) 可与@RequestBody一起使用 > (@RequestBody @Valid User user) @RequestBody(post请求) 这里的requi ...
- linux系统使用grep命令提取文件的基名或者路径名
效果等于~]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 echo "/etc/sysconfig/network-scripts/ ...
- Summer training round2 #8(Training26)
A:贪心DFS 先从最远的搜起 如果一个点的value>=2 就ans++ D:并查集 E:大模拟 F:快速幂 #include <bits/stdc++.h> using name ...
- spark源码本地调试
1.前提条件: 1)安装jdk 版本: 2)安装scala 版本: 3)安装sbt 版本: 4)安装maven 5)安装git 版本: 6)安装idea,并配置好sbt.git.maven 2.从gi ...