ACE中TCP通信

来源:互联网 发布:郑杭生 知乎 编辑:程序博客网 时间:2024/04/28 03:35

ACE中TCP通信

概述:

传输控制协议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端。

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. }  
 

 

这个例子实现的功能很简单,服务器端绑定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. }  
 

 

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

操作

客户端

服务器端

初始化

不需要

调用acceptor.open()绑定端口

建立连接

调用connector.connect()方法

调用acceptor.accept()方法

传输数据

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

关闭连接

调用peer.close()方法

 

原创粉丝点击