zoukankan      html  css  js  c++  java
  • ACE学习笔记(3)——第二个例子:UDP

      下载了《ACE自适配通信环境中文技术文档》,很不错,感谢马维达同志。

      从中篇第二章开始看,按照上一篇的方法将数据报的代码放入项目编译、运行,发现几个
    问题:
      1. 服务端收不到消息,检查客户端发现发送失败,追查下去,可能由于ACE的版本更新,
    按原来的写法在远端地址初始化时出现了问题,给地址时应该以"IP:Port"的方式给出。
      2. 客户端发送成功后,服务端成功收到并回执,但是客户端没收到。检查后,发现是客
    户端接收长度不够,将SIZE_DATA改成29就行了。
      3. 继续调试,发现客户端第二次发送时,服务端突然退出了。一检查,由于客户端将新
    收下的字符串发送出去了,超过了第一次发送的字符串的长度,服务器接收失败。因此,需要
    在客户端接收成功后,重新设置需要发送的字符串。

      下面是修改过的代码:

     1    //Server
     2    #include "ace/OS.h"
     3    #include "ace/SOCK_Dgram.h"
     4    #include "ace/INET_Addr.h"
     5    #include "ace/Log_Msg.h"
     6    
     7    #ifndef _DEBUG
     8    #pragma comment( lib, "ace.lib" )
     9    #else 
    10    #pragma comment( lib, "aced.lib" )
    11    #endif
    12    
    13    #define DATA_BUFFER_SIZE 1024
    14    #define SIZE_DATA 19
    15    
    16    class Server
    17    {
    18    public:
    19        Server(int local_port)
    20            :local_addr_(local_port),local_(local_addr_)
    21        {
    22            data_buf = new char[DATA_BUFFER_SIZE];
    23        }

    24    
    25    
    26        //Expect data to arrive from the remote machine. Accept it and display
    27        //it. After receiving data, immediately send some data back to the
    28        //remote.
    29        int accept_data()
    30        {
    31            int byte_count=0;
    32            while( (byte_count=local_.recv(data_buf,SIZE_DATA,remote_addr_))!=-1)
    33            {
    34                data_buf[byte_count]=0;
    35                ACE_DEBUG((LM_DEBUG, "Data received from remote %s was %s \n"
    36                    ,remote_addr_.get_host_name(), data_buf));
    37                ACE_OS::sleep(1);
    38                if(send_data()==-1break;
    39            }

    40            return -1;
    41        }

    42    
    43        //Method used to send data to the remote using the datagram component
    44        //local_
    45        int send_data()
    46        {
    47            ACE_DEBUG((LM_DEBUG,"Preparing to send reply to client %s:%d\n",
    48                remote_addr_.get_host_name(),remote_addr_.get_port_number()));
    49            ACE_OS::sprintf(data_buf,"Server says hello to you too");
    50            if( local_.send(data_buf, ACE_OS::strlen(data_buf)+1,remote_addr_)==-1)
    51                return -1;
    52            else
    53                return 0;
    54        }

    55    
    56    private:
    57        char *data_buf;
    58        ACE_INET_Addr remote_addr_;
    59        ACE_INET_Addr local_addr_;
    60        ACE_SOCK_Dgram local_;
    61    }
    ;
    62    
    63    
    64    int main(int argc, char *argv[])
    65    {
    66        if(argc<2)
    67        {
    68            ACE_DEBUG((LM_DEBUG,"Usage %s <Port Number>", argv[0]));
    69            ACE_OS::exit(1);
    70        }

    71        Server server(ACE_OS::atoi(argv[1]));
    72        server.accept_data();
    73        return 0;
    74    }

    75

     1    //Client
     2    #include "ace/OS.h"
     3    #include "ace/SOCK_Dgram.h"
     4    #include "ace/INET_Addr.h"
     5    #include "ace/Log_Msg.h"
     6    
     7    #ifndef _DEBUG
     8    #pragma comment( lib, "ace.lib" )
     9    #else 
    10    #pragma comment( lib, "aced.lib" )
    11    #endif
    12    
    13    #define DATA_BUFFER_SIZE 1024
    14    #define SIZE_DATA 29
    15    
    16    class Client
    17    {
    18    public:
    19        Client(char * remote_host)
    20            :remote_addr_(remote_host),
    21            local_addr_((u_short)0),local_(local_addr_)
    22        {
    23            data_buf = new char[DATA_BUFFER_SIZE];
    24            //remote_addr_.set_port_number(port);
    25        }

    26    
    27        //Receive data from the remote host using the datgram wrapper `local_’.
    28        //The address of the remote machine is received in `remote_addr_’
    29        //which is of type ACE_INET_Addr. Remember that there is no established
    30        //connection.
    31        int accept_data()
    32        {
    33            if(local_.recv(data_buf,SIZE_DATA,remote_addr_)!=-1)
    34            {
    35                ACE_DEBUG((LM_DEBUG, "Data received from remote server %s was: %s \n" ,
    36                    remote_addr_.get_host_name(), data_buf));
    37                return 0;
    38            }

    39            else
    40                return -1;
    41        }

    42    
    43        //Send data to the remote. Once data has been sent wait for a reply
    44        //from the server.
    45        int send_data()
    46        {
    47            ACE_DEBUG((LM_DEBUG,"Preparing to send data to server %s:%d\n",
    48                remote_addr_.get_host_name(),remote_addr_.get_port_number()));
    49            ACE_OS::sprintf(data_buf,"Client says hello");
    50    
    51            while(local_.send(data_buf,ACE_OS::strlen(data_buf),remote_addr_)!=-1)
    52            {
    53                ACE_OS::sleep(1);
    54                if(accept_data()==-1)
    55                    break;
    56                ACE_OS::sprintf(data_buf,"Client says hello");
    57            }

    58    
    59            return -1;
    60        }

    61    
    62    private:
    63        char *data_buf;
    64        ACE_INET_Addr remote_addr_;
    65        ACE_INET_Addr local_addr_;
    66        ACE_SOCK_Dgram local_;
    67    }
    ;
    68    
    69    int main(int argc, char *argv[])
    70    {
    71        if(argc<2)
    72        {
    73            ACE_OS::printf("Usage: %s <hostname:port_number> \n", argv[0]);
    74            ACE_OS::exit(1);
    75        }

    76        Client client(argv[1]);
    77        client.send_data();
    78        system("pause");
    79        return 0;
    80    }
  • 相关阅读:
    使用IDEA进行远程调试
    看实习生需求文档有感
    企业应用系统设计分享PPT
    tmux/screen里面如何用鼠标滚轮来卷动窗口内容
    Error: cannot find a valid baseurl for repo: rpmfusion-free 解决办法
    pom中定义某jar包的依赖,但并不使用该jar包,那最后部署的应用中会有这个jar包么?
    U盘容量减少的解决办法
    使用注解属性绑定
    RESTful的理解
    Spring 文件上传功能
  • 原文地址:https://www.cnblogs.com/gamesacer/p/921473.html
Copyright © 2011-2022 走看看