`

ACE中TCP通信

    博客分类:
  • ACE
阅读更多

概述:

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

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

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

常用API:

1. ACE_INET_Addr类。

ACE"地址"ACE_Addr的子类,表示TCP/IPUDP/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端。

#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的功能。

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

#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()方法

分享到:
评论

相关推荐

    ACE_SOCK_TCP.rar_ACE_ACE TCP C++_ACE tcp_ace-6

    通过分析和学习这些代码,开发者可以深入理解ACE库在TCP通信中的应用,从而在自己的项目中灵活运用。 总结来说,ACE库提供了一套完整的工具集,使得在C++中实现TCP通信变得更加简单和高效。通过使用ACE_SOCK_...

    ACE学习文档大全.rar

    9. **ACE中TCP通信**: TCP是网络通信中最常用的一种协议,ACE提供了对TCP协议的全面支持。学习如何使用ACE创建TCP服务器和客户端,包括连接建立、数据传输、异常处理等,有助于开发者深入理解网络编程的细节。 总...

    ACE_Proactor TCP协议通信示例代码

    ACE_Proactor是一个高级事件处理库,它为C++程序员提供了异步I/O操作的抽象,包括TCP协议的网络通信。这个示例代码是关于...通过理解和应用这些示例代码,你可以学习到如何使用ACE库来构建高效、健壮的TCP通信系统。

    ACE自适配通信环境中文技术文档

    3. **网络编程**:讲解如何使用ACE进行TCP/UDP/IP通信,以及高级网络编程技巧,如套接字选项、错误处理等。 4. **并发与同步**:介绍ACE提供的线程、信号量、互斥量等并发控制机制,以及如何实现线程安全的编程。 5....

    ACE_Proactor网络通信示例代码

    在实际的TCP通信中,`ACE_Proactor`扮演着调度者的角色,它管理事件的注册、调度和回调。当有新的TCP连接请求或数据到达时,它会根据预设的策略调用相应的处理器方法,使得程序可以在不阻塞主线程的情况下处理网络...

    ACE自适配通信环境中技术

    在“ACE自适配通信环境中文技术文档(上,中,下篇)”中,读者可以详细了解到上述各个方面的具体实现和使用方法,通过丰富的例子和概念解释,帮助开发者深入理解ACE框架,并能有效地将其应用到实际项目中。

    ACE简单网络通信

    在ACE库中,`ACE_SOCK`是用于处理TCP和UDP通信的基础类。`ACE_SOCK`类提供了打开、绑定、监听、接受和连接等网络通信的基本操作。对于TCP,你可以创建一个`ACE_SOCK_Acceptor`对象来监听客户端的连接请求,然后在...

    ACE_server.rar_ACE server_ACE tcp_ACE_SERVER_ACE框架_ace server cl

    在“ACE_server.rar”这个压缩包中,包含的是使用ACE库搭建的一个TCP服务器和客户端框架。这个框架设计得简洁且易于扩展,适合开发者快速构建自己的网络服务。 首先,我们来了解一下ACE库的核心特性。ACE是一个开源...

    C++ 自适应通信环境ACE

    在《C++自适应通信环境ACE》这本电子书中,作者深入浅出地介绍了ACE框架的核心概念和技术细节。这本书分为多个部分,其中"中篇:ACE程序员教程.pdf"可能是专门针对ACE的编程实践进行讲解,涵盖了如何使用ACE库进行...

    TCP socket通信实例(心跳)

    心跳包是在TCP通信中经常使用的另一种保持连接活性的方法。它通过周期性地发送一个小的数据包(通常称为“心跳包”)来确保连接的有效性和可用性。心跳包的设计一般非常简单,只包含一些基本的信息如包类型、序列号...

    QT+ACE实现简单的TCP客户端

    QT和ACE都是在软件开发中常用的库,它们在构建网络通信应用方面有着广泛的应用。本文将详细介绍如何使用QT和ACE库来实现一个简单的TCP客户端,以及在这个过程中可能遇到的关键概念和技术。 首先,QT是一个跨平台的...

    ACE 客户端与服务器模拟通信

    在“ACE 客户端与服务器模拟通信”这个场景中,我们探讨的是如何利用ACE库来实现客户端和服务器之间的交互。 首先,让我们详细了解一下ACE库的核心特性。ACE库提供了一整套的网络编程接口,包括TCP/IP、UDP、SCTP等...

    CAsyncSocket TCP实例

    在Windows编程环境中,CAsyncSocket类是MFC(Microsoft Foundation Classes)库提供的一种用于实现TCP/IP通信的工具。本篇文章将深入探讨CAsyncSocket类在TCP实例中的应用,以及如何利用它来创建一个简单的聊天...

    ACE自适配通信环境.rar

    7. **对象定位与发现**:ACE提供了服务注册和服务发现机制,使得分布式系统中的组件能够找到并通信彼此,即使在网络拓扑变化的情况下也能保持连接。 8. **容错和恢复机制**:ACE包含了故障检测、恢复和重新配置的...

    jace的全部原代码类似于C++的ACE自适配通信框架

    在Jace中,C++的类和接口可以通过JNI(Java Native Interface)进行封装,使得Java程序能够像操作本地对象一样使用C++的库,这与ACE的自适配通信特性有异曲同工之妙。 在技术实现上,Jace利用了C++的模板和元编程...

    ACE自适配通信环境

    6. **命名服务**:ACE提供了一个轻量级的命名服务,使得分布式系统中的组件可以通过名字查找和通信,增强了系统的可扩展性和可发现性。 7. **分布式对象框架**:ACE包含了CORBA(Common Object Request Broker ...

    ACE中文技术开发文档

    - **Stream和Datagram**:ACE提供了TCP和UDP两种传输层协议的接口,Stream对应TCP的流式通信,Datagram对应UDP的无连接通信。 - **TCP/UDP Endpoint**:表示网络通信的地址和端口,是连接建立的基础。 - **Timer ...

    ACE库入门(中文)

    ACE库的核心理念是提供一组抽象接口,用于处理网络通信中的各种复杂问题,如并发性、异步事件处理、时间同步和资源管理等。 在入门ACE库的过程中,首先需要了解其主要组成部分: 1. **线程管理**:ACE提供了线程...

Global site tag (gtag.js) - Google Analytics