ACE的Socket初步

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连接)。

代码示例:

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;
} 
时间: 2024-08-05 07:07:29

ACE的Socket初步的相关文章

socket 初步使用

   socket分为2个部分,1部分是服务器端,监听某个接口,当有客户端有请求时,自动运行代码. 第二个部分是客户端,来传送数据. <?php //服务器端口 header('Content-type:text/html;Charset=GBK'); //服务器段程序,监听借口,并进行相应的数据处理 /* socket 服务器通信整个过程 socket_creat socket_bind socket_listen socket_accetp socket_read socket_write

python3.x——socket初步

python3.x,socket. 网络请求的本质是socket,俗称套接字. 以udp为例,通俗来讲时,包括五个流程: 客户端: 1 # 通信的五个步骤 2 3 from socket import * 4 5 # 1.选择通信方式 6 udpSocket = socket(AF_INET, SOCK_DGRAM) 7 # 2.对方通信地址 8 sendAddr = ("192.168.10.198", 8080) 9 # 3.写入数据 10 sendData = bytes(inp

java socket初步学习一 ( tcp)

Java socket通信程序: 第一版本: 实现功能: 服务器地址:127.0.0.1  端口:5050 客户机:端口5050 客户端发送字符:“t” 服务器接收到该字符并回复:“r” 流程: 建立java工程,默认在workspace中,udpServer为工程名,此时work/udpServer文件夹 建立类名为server,则此时服务器代码为: package udpServer; import java.io.*; import java.net.*; public class ser

c实现windows socket

服务端代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 /*     * testSocketService.c     *     *  Created on: 2012-8-16     *      Author: 皓月繁星     */ #include <WINSOCK

ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于Reactor框架的服务器. 首先回顾下Reactor模式和Preactor模式. Reactor模式: Reactor模式实现非常简单,使用同步IO模型,即业务线程处理数据需要主动等待或询问,主要特点是利用epoll监听listen描述符是否有响应,及时将客户连接信息放于一个队列,epoll和队列

ACE的源码划分

前几篇文章也提到过,ACE的所有源文件和头文件都杂乱堆在了ACE_wrappers/ace目录下.这样的代码组织方式给学习ACE带来了很大的困难,很多朋友在看到ace目录下庞大的代码的时候,几乎就失去了学习ACE的信心^_^.因此,我们有必要对ACE的代码进行重新组织,以降低学习曲线.下面,我将给出我对ACE源码的划分方法.其实,我也是刚学习ACE没有多久,对ACE的了解还甚少,所以,我的源码划方式法不一定十分正确,这里共享出来,仅供大家参考. 其实,在ACE的帮助文档里,ACE-subsets

ACE源代码目录结构

ACE(ADAPTIVE Communication Environment),中文的意思就是自适配通讯环境,ACE是一个用于开发网络程序的优秀的C++的框架,在国外有很广泛的使用,在国内一些大的开发通讯产品的公司也有使用.我接触ACE也有一段时间了,虽然时间不长,但我还是感觉到ACE确实是一个好东西,对于丰富自己的知识面有很大的帮助.虽然我们项目目前是采用C语言来开发,但是当接触ACE后,你会发现"喔,原来程序还可以这样".例如:我觉得ACE里面Reactor框架就是一个非常的东西,

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

一.tomat启动流程 1.启动HttpConnector connector等待连接请求,只负责接受socket请求,具体处理过程交给HttpProcessor处理. tomcat用户只能访问到connector,能设置接受的数据的buffer大小,而不能看见HttpProcessor的处理过程. 2.创建HttpProcessor对象池 创建对象后马上调用start()方法启动processor的线程: private HttpProcessor newProcessor() { HttpP

How Tomcat Works 3

Tomcat体系结构中有一个非常重要的概念--连接器,看下面这张图 一个connecotr对应一个container,connector用于接收请求,然后传递给container组件去处理,tomcat中默认的连接器是coyote,按照协议类型分,有http和ajp的连接器. HTTP/1.1协议负责建立HTTP连接,web应用通过浏览器访问tomcat服务器用的就是这个连接器,默认监听的是8080端口: AJP/1.3协议负责和其他HTTP服务器建立连接,监听的是8009端口,比如tomcat