ACE中TCP通信
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/07/585095.html
概述:
传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的、面向连接的运输服务,用于高可靠性数据的传输。TCP协议的可靠性是指保证每个tcp报文能按照发送顺序到达客户端。
Tcp通信过程一般为如下步骤:
- 服务器绑定端口,等待客户端连接。
- 客户端通过服务器的ip和服务器绑定的端口连接服务器。
- 服务器和客户端通过网络建立一条数据通路,通过这条数据通路进行数据交互。
常用API:
1. ACE_INET_Addr类。
ACE"地址"类ACE_Addr的子类,表示TCP/IP和UDP/IP的地址。它通常包含机器的ip和端口信息,通过它可以定位到所通信的进程。
定义方式:
ACE_INET_Addr addInfo(3000,"192.168.1.100");
常用方法:
- get_host_name 获取主机名
- get_ip_address 获取ip地址
- get_port_number 获取端口号
2. ACE_SOCK_Acceptor类。
服务期端使用,用于绑定端口和被动地接受连接。
常用方法:
- open 绑定端口
- accept建立和客户段的连接
3. ACE_SOCK_Connector类。
客户端使用,用于主动的建立和服务器的连接。
常用方法:
- connect() 建立和服务期的连接。
4. ACE_SOCK_Stream类。
客户端和服务器都使用,表示客户段和服务器之间的数据通路。
常用方法:
- send () 发送数据
- recv () 接收数据
- 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(); //绑定的端口
ACE_SOCK_Acceptor acceptor;
if (acceptor.open (port_to_listen, ) == -) //绑定端口
{
cout<<endl<<"bind port fail"<<endl;
return -;
} while(true)
{
ACE_SOCK_Stream peer; //和客户端的数据通路
ACE_Time_Value timeout (, ); if (acceptor.accept (peer) != -) //建立和客户端的连接
{
cout<<endl<<endl<<"client connect. "<<endl;
char buffer[];
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))) != -) //读取客户端发送的数据
{
peer.send(buffer, bytes_received); //对客户端发数据
}
peer.close ();
}
} return ;
}
这个例子实现的功能很简单,服务器端绑定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(,"127.0.0.1"); ACE_SOCK_Connector connector;
ACE_Time_Value timeout(,);
ACE_SOCK_Stream peer; if(connector.connect(peer,addr,&timeout) != )
{
cout<<"connection failed !"<<endl;
return ;
}
cout<<"conneced !"<<endl; string s="hello world";
peer.send(s.c_str(),s.length()); //发送数据
cout<<endl<<"send:\t"<<s<<endl; ssize_t bc=; //接收的字节数 char buf[];
bc=peer.recv(buf,,&timeout); //接收数据
if(bc>=)
{
buf[bc]='\0';
cout<<endl<<"rev:\t"<<buf<<endl;
}
peer.close(); return ;
}
下表给出了服务器端和客户端的传输过程的比较:
操作 |
客户端 |
服务器端 |
初始化 |
不需要 |
调用acceptor.open()绑定端口 |
建立连接 |
调用connector.connect()方法 |
调用acceptor.accept()方法 |
传输数据 |
发送:调用peer.recv()方法 |
|
关闭连接 |
调用peer.close()方法 |
ACE中TCP通信的更多相关文章
- ACE中UDP通信
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/07/585205.html udp是一种无连接的协议,提供无连接不可靠的服务. 在ace中,通 ...
- 清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)C#版
目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程, ...
- QT实现TCP通信服务器端和客户端(支持多个客户端)精简版
上星期接了个私活,工期两星期,报酬3000,写一个小软件,采集定向网络上的数据,并进行双向通信,捣鼓了两天,终于把QT中tcp通信这块调通了,找过N多例子,绝大部分都是基本的一个服务端一个客户端通信的 ...
- C#版清晰易懂TCP通信原理解析(附demo)
[转] C#版清晰易懂TCP通信原理解析(附demo) (点击上方蓝字,可快速关注我们) 来源:周见智 cnblogs.com/xiaozhi_5638/p/4244797.html 对.NET中网络 ...
- TCP通信中的大文件传送
TCP通信中的大文件传送 源码 (为节省空间,不包含通信框架源码,通信框架源码请另行下载) 文件传送在TCP通信中是经常用到的,本文针对文件传送进行探讨 经过测试,可以发送比较大的文件,比如1个G ...
- TCP通信实现对接硬件发送与接收十六进制数据 & int与byte的转换原理 & java中正负数的表示
今天收到的一份需求任务是对接硬件,TCP通信,并给出通信端口与数据包格式,如下: 1.首先编写了一个简单的十六进制转byte[]数组与byte[]转换16进制字符串的两个方法,如下: /** * 将十 ...
- C#中使用TCP通信
TCP通信需要通信双方都在线,所以需要先启动服务端进行监听,客户端才能获得连接,服务端代码: static void Main(string[] args) { TcpClient client = ...
- 【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
基础准备 首先需要明白数据传输的底层实现机制,在http://blog.csdn.net/ns_code/article/details/15813809这篇博客中有详细的介绍,在上面的博客中,我们提 ...
- TCP通信 -C/S中的Socket与ServerSocket
客户端类:Socket类 TCP通信的客户端:向服务器发送连接请求,给服务器发送数据,读取服务器的数据,两次IO流 java.lang.Object 继承者 java.net.Socket 构造方法: ...
随机推荐
- java基础-Comparator接口与Collections实现排序算法
java 排序Comparable和Comparator使用 java提供了两个排序用的接口Comparable和Comparator,一般情况下使用区别如下: Comparable 接口用于类的固定 ...
- python selenium 使用htmlunit 执行测试。非图形界面浏览器。
其实就是换个浏览器,只是这个浏览器没有图形界面而已. browser = webdriver.Chrome() 换成 browser = webdriver.Remote(desired_capabi ...
- Ubuntu—终端命令调整窗口的大小
1,查看窗口大小 current 1280x768 是我当前电脑的窗口大小,下面提供的是可以修改的窗口大小. $ xrandr 2.修改窗口大小 示例: $ xrandr -s 1024x768
- 贵州省未来二十年的投资机会的探讨1>
贵州的股市 1.000540.SZ 中天金融 2.000589.SZ 黔轮胎A 3.000733.SZ 振华科技 4.000851.SZ 高鸿股份 5.000920.SZ 南方汇通 6.002025. ...
- Linux内核设计笔记8——下半部
# 下半部笔记 1. 软中断 软中断实现 软中断是在编译期间静态分配,其结构如下所示,结构中包含一个接受该结构体指针作为参数的action函数. struct softirq_action{ void ...
- 创建https证书
第一个里程碑:创建https证书 创建文件认证目录 mkdir /application/nginx/key/ -p 在认证目录下创建认证文件 openssl req -new -x509 -node ...
- Tengine/Nginx 安装
原文出处:http://my.oschina.net/liuhuan0927/blog/604663 一.Tengine是什么 简介 Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基 ...
- 【转】AMD 的 CommonJS wrapping
其实本文的标题应该是「为什么我不推荐使用 AMD 的 Simplified CommonJS wrapping」,但太长了不好看,为了美观我只能砍掉一截. 它是什么? 为了复用已有的 CommonJS ...
- lintcode-18-带重复元素的子集
带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 注意事项 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 样例 如果 S = [1,2,2] ...
- RXSwift--登录注册那点事
在iOS学习中登录注册是一个万能的可以拿出来实战的demo.接下来我们就从登录开始入手,PS:如果你对RXSwift中的概念和一些常用的函数不清楚可以参考这篇文章(可能打开比较慢请耐心等待).开始直接 ...