ACE中TCP通信

ACE 客户端与服务器 文件传输 客户端ACE实现,服务器端完成端口,实现客户端到服务器端的文件按名传输。 立即下载

概述:

传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的、面向连接的运输服务,用于高可靠性数据的传输。TCP协议的可靠性是指保证每个tcp报文能按照发送顺序到达客户端。

Tcp通信过程一般为如下步骤:

  1. 服务器绑定端口,等待客户端连接。
  2. 客户端通过服务器的ip和服务器绑定的端口连接服务器。
  3. 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互。

常用API:

1. ACE_INET_Addr类。

ACE"地址"类ACE_Addr的子类,表示TCP/IP和UDP/IP的地址。它通常包含机器的ip和端口信息,通过它可以定位到所通信的进程。

定义方式:
ACE_INET_Addr addInfo(3000,"192.168.1.100"); 

常用方法:

  1. get_host_name    获取主机名
  2. get_ip_address    获取ip地址
  3. get_port_number    获取端口号

2. ACE_SOCK_Acceptor类。

服务期端使用,用于绑定端口和被动地接受连接。
常用方法:

  1. open 绑定端口
  2. accept建立和客户段的连接

3.  ACE_SOCK_Connector类。

客户端使用,用于主动的建立和服务器的连接。
常用方法:

  1. connect()    建立和服务期的连接。

 4. ACE_SOCK_Stream类。

客户端和服务器都使用,表示客户段和服务器之间的数据通路。
常用方法:

  1. send ()    发送数据
  2. recv ()    接收数据
  3. close()    关闭连接(实际上就是断开了socket连接)。

代码示例:

下面例子演示了如何如何用ACE创建TCP通信的Server端。

Cpp代码 复制代码
  1. #include "ace/SOCK_Acceptor.h"   
  2. #include "ace/SOCK_Stream.h"   
  3. #include "ace/INET_Addr.h"   
  4. #include "ace/OS.h"   
  5.   
  6. #include <string>   
  7. #include <iostream>   
  8. using namespace std;   
  9.   
  10. int main(int argc, char *argv[])    
  11. {   
  12.     ACE_INET_Addr port_to_listen(3000);        //绑定的端口   
  13.     ACE_SOCK_Acceptor acceptor;   
  14.     if (acceptor.open (port_to_listen, 1) == -1)     //绑定端口   
  15.     {   
  16.         cout<<endl<<"bind port fail"<<endl;   
  17.         return -1;   
  18.     }   
  19.   
  20.     while(true)   
  21.     {   
  22.         ACE_SOCK_Stream peer;        //和客户端的数据通路   
  23.         ACE_Time_Value timeout (10, 0);   
  24.   
  25.         if (acceptor.accept (peer) != -1)    //建立和客户端的连接   
  26.         {   
  27.             cout<<endl<<endl<<"client connect. "<<endl;   
  28.             char buffer[1024];   
  29.             ssize_t bytes_received;   
  30.   
  31.             ACE_INET_Addr raddr;   
  32.             peer.get_local_addr(raddr);   
  33.             cout<<endl<<"local port/t"<<raddr.get_host_name()<<"/t"<<raddr.get_port_number()<<endl;   
  34.   
  35.             while ((bytes_received =   
  36.                 peer.recv (buffer, sizeof(buffer))) != -1)    //读取客户端发送的数据   
  37.             {   
  38.                 peer.send(buffer, bytes_received);    //对客户端发数据   
  39.             }   
  40.             peer.close ();   
  41.         }   
  42.     }   
  43.   
  44.     return 0;    
  45. }  
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/OS.h"

#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) 
{
    ACE_INET_Addr port_to_listen(3000);        //绑定的端口
    ACE_SOCK_Acceptor acceptor;
    if (acceptor.open (port_to_listen, 1) == -1)     //绑定端口
    {
        cout<<endl<<"bind port fail"<<endl;
        return -1;
    }

    while(true)
    {
        ACE_SOCK_Stream peer;        //和客户端的数据通路
        ACE_Time_Value timeout (10, 0);

        if (acceptor.accept (peer) != -1)    //建立和客户端的连接
        {
            cout<<endl<<endl<<"client connect. "<<endl;
            char buffer[1024];
            ssize_t bytes_received;

            ACE_INET_Addr raddr;
            peer.get_local_addr(raddr);
            cout<<endl<<"local port/t"<<raddr.get_host_name()<<"/t"<<raddr.get_port_number()<<endl;

            while ((bytes_received =
                peer.recv (buffer, sizeof(buffer))) != -1)    //读取客户端发送的数据
            {
                peer.send(buffer, bytes_received);    //对客户端发数据
            }
            peer.close ();
        }
    }

    return 0; 
}
 

 

这个例子实现的功能很简单,服务器端绑定3000号端口,等待一个客户端的连接,然后将从客户端读取的数据再次转发给客户端,也就是实现了一个EchoServer的功能。

相应的客户端程序也比较简单,代码如下:

Cpp代码 复制代码
  1. #include <ace/SOCK_Stream.h>   
  2. #include <ace/SOCK_Connector.h>    
  3. #include <ace/INET_Addr.h>   
  4. #include <ace/Time_Value.h>    
  5.   
  6. #include <string>   
  7. #include <iostream>   
  8. using namespace std;   
  9.   
  10. int main(int argc, char *argv[])    
  11. {   
  12.     ACE_INET_Addr addr(3000,"127.0.0.1");   
  13.   
  14.     ACE_SOCK_Connector connector;       
  15.     ACE_Time_Value timeout(5,0);   
  16.     ACE_SOCK_Stream peer;   
  17.   
  18.     if(connector.connect(peer,addr,&timeout) != 0)   
  19.     {   
  20.         cout<<"connection failed !"<<endl;   
  21.         return 1;   
  22.     }   
  23.     cout<<"conneced !"<<endl;   
  24.   
  25.     string s="hello world";   
  26.     peer.send(s.c_str(),s.length());    //发送数据   
  27.     cout<<endl<<"send:/t"<<s<<endl;   
  28.   
  29.     ssize_t bc=0;            //接收的字节数   
  30.   
  31.     char buf[1024];   
  32.     bc=peer.recv(buf,1024,&timeout);    //接收数据   
  33.     if(bc>=0)   
  34.     {   
  35.         buf[bc]='/0';   
  36.         cout<<endl<<"rev:/t"<<buf<<endl;   
  37.     }   
  38.     peer.close();   
  39.   
  40.     return 0;    
  41. }  
#include <ace/SOCK_Stream.h>
#include <ace/SOCK_Connector.h> 
#include <ace/INET_Addr.h>
#include <ace/Time_Value.h> 

#include <string>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) 
{
    ACE_INET_Addr addr(3000,"127.0.0.1");

    ACE_SOCK_Connector connector;    
    ACE_Time_Value timeout(5,0);
    ACE_SOCK_Stream peer;

    if(connector.connect(peer,addr,&timeout) != 0)
    {
        cout<<"connection failed !"<<endl;
        return 1;
    }
    cout<<"conneced !"<<endl;

    string s="hello world";
    peer.send(s.c_str(),s.length());    //发送数据
    cout<<endl<<"send:/t"<<s<<endl;

    ssize_t bc=0;            //接收的字节数

    char buf[1024];
    bc=peer.recv(buf,1024,&timeout);    //接收数据
    if(bc>=0)
    {
        buf[bc]='/0';
        cout<<endl<<"rev:/t"<<buf<<endl;
    }
    peer.close();

    return 0; 
}
 

 

下表给出了服务器端和客户端的传输过程的比较:

操作

客户端

服务器端

初始化

不需要

调用acceptor.open()绑定端口

建立连接

调用connector.connect()方法

调用acceptor.accept()方法

传输数据

发送:调用peer.recv()方法
接收:调用peer.send()方法

关闭连接

调用peer.close()方法

 

从零构建工业级SPI-CAN网关:CH347与CH9431的软硬件协同设计实战 本文详细介绍了基于CH347和CH9431芯片构建工业级SPI-CAN网关的完整方案。通过硬件架构设计、Linux驱动定制、并发处理优化和EMC抗干扰测试,实现高可靠性通信网关,适用于工业自动化和汽车电子等严苛环境。 阅读详情

相关推荐

TSMaster MBD模块实战:如何用Simulink模型快速搭建汽车电子测试环境

本文实战演示了如何利用TSMaster的MBD模块,将Simulink模型快速部署为汽车电子自动化测试环境的核心。通过建立模型与TSMaster系统变量的实时数据通道,并利用数据仓库统一数据定义,工程师能无缝连接算法仿真与真实总线网络,显著提升从模型到HIL测试的验证效率。

php55的博客 207

学习ACE网络编程(一)------使用ACE流实现TCP/IP协议传输功能

ACE中的流包装提供面向连接的通信。 基于TCP/IP传输协议需要如下ACE类库: ACE_SOCK_Acceptor 用于被动的建立连接。用于服务器端 ACE_SOCK_Connector 用于主动的连接建立。用于客户端 ACE_SOCK_IO 用于提供面向连接的消息传递服务。封装了send()、recv()和write()等调用。该类是ACE_SOCK_Stream的基类。 ACE_SOC...

mengmeng0510的博客 1635

2.4G跳频算法 2.4G切信道算法 (简例示意nRF52832)

2.4G跳频算法 nRF52832示例 2.4G自适应信道算法

Peter.Min 957

ACE_Svc_Handler 通信原理

<br />ACE作为通讯方面的开源架构,不但用c++实现,而且用JAVA实作的架构已经可以使用了,由此看来掌握ACE成为每歌开发通讯程序的程序员的必备技能。<br />ACE的库分为4个层次:<br />l        OS适配层该层将ACE的较高层和与OS机制相关联的平台特有的依赖屏蔽开来。<br />l        OO包装层封装并增强在像Win32和UNIX这样的现代操作系统上可用的并发、进程间通信(IPC)、以及虚拟内存机制。应用可以通过有选择地继承、聚合(aggregating)、和/或

飘羽随风 1901

从Palantir到AI时代:Forward Deployed Engineer模式的深度解析

《从Palantir到AI时代:FDE模式的创新与挑战》摘要:Palantir开创的前置部署工程师(FDE)模式正在成为AI创业公司的标配。该模式通过现场工程师深入了解客户需求,填补产品与实际应用间的鸿沟,颠覆了传统SaaS规模化路径。核心优势在于将定制化服务转化为产品发现机制,特别适合高度异质化的AI市场。成功关键在于平衡定制与标准化,通过合同价值增长、产品杠杆效应等独特指标衡量成效。FDE人才需要兼具领域洞察力与快速原型能力。这一模式表明,在AI等新兴领域,深入客户现场可能比单纯追求技术突破更能创造商业

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 4544

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 249

ACE 封装TCP服务端

ACE TCP Server

记录学习 1289

从零拆解快手Web端__NS_hxfalcon:JS逆向签名参数定位与复现

在JS逆向与前端反爬攻防中,签名参数总是绕不开的核心环节。无论是接口加密还是请求签名,其本质都是通过在客户端收集环境信息、时间戳与业务参数,经特定算法计算后生成用于服务端校验的动态令牌。理解这类参数的生成原理,不仅能提升逆向分析效率,也能帮助前端开发者更好地设计自身接口防护方案。在实际工程中,面对经Webpack打包且高度混淆的代码,直接全局搜索参数名往往难以奏效,需要结合请求抓包、调用栈跟踪、环境适配等方法逐步定位。此类签名参数广泛存在于现代Web应用的GraphQL或REST接口中,是接口数据安全的重要

weixin_29474431的博客 337

ACE 多线TCP服务端-客户端通信

实现的功能是每一个客户端发送的信息,通过服务器,都可以转发给其它所有人看到。 前提是所有人

j_akill的专栏 2562

Switch游戏安装新思路:抛弃Commander One,试试这款免费的Mac神器OpenMTP

本文介绍了Mac用户安装Switch游戏的新选择——免费工具OpenMTP,对比收费软件Commander One,OpenMTP在MTP连接稳定性和文件管理上更具优势。详细解析了OpenMTP的安装配置、核心功能及实战操作,帮助用户高效完成游戏安装,特别适合已破解并安装DBI的Switch用户。

weixin_30664051的博客 586

2026年经典爬虫案例专栏|第17篇:学术论文爬虫实战——知网与万方数据采集

字段名说明数据类型title论文标题字符串authors作者列表列表abstract摘要字符串keywords关键词列表列表journal发表期刊字符串year发表年份整数volume卷号字符串issue期号字符串pages页码范围字符串citations引用次数整数downloads下载次数整数doiDOI编号字符串url论文链接字符串学术论文爬虫是科研工作的重要辅助工具,可以帮助研究人员高效地收集和管理论文数据。

2201_76125261的博客 1063

ACE的TCP通信

ACE的TCP通信相当简单。服务器端用一个接受器Acceptor,这是个通信数据流Stream的工场模式。对于TCP,则分别为ACE_SOCK_Acceptor和ACE_SOCK_Stream。对应的客户端则用一个连接器Connecter,这个也是数据流Stream的工场模式。对于TCP,为ACE_SOCK_Connecter。TCP/IP通信用的地址则用ACE_INET_Addr类型。具

qizhao2001(tu2s)的专栏 1075

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

ACE实现简单的TCP通信

<br /><br /> <br />原文来自http://andylin02.javaeye.com/blog/470287<br />概述:<br />传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的、面向连接的运输服务,用于高可靠性数据的传输。TCP协议的可靠性是指保证每个tcp报文能按照发送顺序到达客户端。<br />Tcp通信过程一般为如下步骤:服务器绑定端口,等待客户端连接。客户端通过服务器的ip和服务器绑定的端口连接服务器。服务器和客户端通过网

梦想照进现实 758

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: ACE读取ini格式的配置文档
下一篇: ACE中UDP通信
needle2
博客等级 码龄17年 46粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值