zoukankan      html  css  js  c++  java
  • ACE_linux:UDP通信

    1.涉及类

    ACE_INET_Addr//ACE网络地址
    ACE_SOCK_Dgram//ACE报文

    2.简介

    UDP通信时无需像TCP那样建立连接和关闭连接,TCP编程时需要通过accept和connect来建立连接,而UDP通信省略了这一步骤,相对来说编程更为简单。

    由于UDP通信时无建立连接,服务器端不能像TCP通信那样在建立连接的时候就获得客户端的地址信息,故服务器端不能主动对客户端发送信息(不知道客户端的地址),只有等到收到客户端发送的UDP信息时才能确定客户端的地址信息,从而进行通信。

    UDP通信过程如下:

    l 服务器端绑定一固定UDP端口,等待接收客户端的通信。

    l 客户端通过服务器的ip和地址信息直接对服务器端发送消息。

    l 服务器端收到客户端发送的消息后获取客户端的ip和端口信息,通过该地址信息和客户端通信。

    3.示例代码

     1 #include <iostream>
     2 #include "ace/SOCK_Dgram.h"
     3 using namespace std;
     4 
     5 const int  SERVER_PORT = 3000 ;
     6 int main(int argc, char *argv[]) 
     7 {
     8     char buffer[1024];
     9     ssize_t bc=0;            //接收的字节数
    10     ACE_SOCK_Dgram  peer;//SOCK_IO,和客户端的数据通路
    11     ACE_Time_Value timeout(100, 0);//TCP接受超时时间
    12     ACE_INET_Addr remoteAddr;    //所连接的远程地址
    13 
    14     //Socket创建,绑定,监听
    15     ACE_INET_Addr addr(SERVER_PORT);
    16     if(peer.open(addr) != 0)     //绑定端口
    17     {
    18         cout<<"bind port fail!"<<endl;
    19         return -1;
    20     }
    21     cout<<"server ready. "<<endl;
    22     
    23     while(true)
    24     {
    25         while(true)
    26         {
    27             //接收数据(超时或对端断开break)
    28             if((bc=peer.recv(buffer,1024,remoteAddr,0,&timeout))<=0)    
    29             {
    30                 break;  
    31             }
    32             buffer[bc]='';
    33             cout<<"[server rev]:>"<<buffer<<endl;
    34             if(strcmp(buffer, "quit") == 0)  
    35             {
    36                 break;  
    37             }
    38             
    39             //发送数据
    40             do
    41             {
    42                 cout<<"[server cin]:>";
    43                 cin.getline(buffer,1024);
    44             }while(strlen(buffer)<=0); 
    45             peer.send(buffer, strlen(buffer),remoteAddr,0,&timeout);    
    46         }
    47     }
    48     peer.close ();//UDP服务器用不到
    49 
    50     return 0; 
    51 }
    server.cpp
     1 #include <ace/SOCK_Dgram.h> 
     2 
     3 #include <string>
     4 #include <iostream>
     5 using namespace std;
     6 
     7 const int  SERVER_PORT = 3000 ;
     8 
     9 int main(int argc, char *argv[]) 
    10 {
    11     char buffer[1024];
    12     ssize_t bc=0;            //接收的字节数
    13 
    14     ACE_INET_Addr remoteAddr(SERVER_PORT,"192.168.237.128");
    15     ACE_INET_Addr addr;
    16     ACE_Time_Value timeout(100,0);
    17     ACE_SOCK_Dgram  peer(addr);
    18 
    19     cout<<"ready !"<<endl;
    20 
    21     while(true)
    22     {
    23         //发送数据
    24         do
    25         {
    26             cout<<"[client cin]:>";
    27             cin.getline(buffer,1024);
    28         }while(strlen(buffer)<=0); 
    29         peer.send(buffer, strlen(buffer),remoteAddr,0,&timeout);    
    30 
    31         //接收数据(超时或对端断开break)
    32         if((bc=peer.recv(buffer,1024,remoteAddr,0,&timeout))<=0)    
    33         {
    34             break;  
    35         }
    36         buffer[bc]='';
    37         cout<<"[client rev]:>"<<buffer<<endl;
    38         if(strcmp(buffer, "quit") == 0)  
    39         {
    40             break;  
    41         }
    42     }
    43     peer.close();
    44 
    45     return 0; 
    46 }
    client.cpp

    ok!

  • 相关阅读:
    java 中for each语句
    设备树使用手册
    Java中 final static super this instanceof 关键字用法
    Java 抽象类与oop三大特征
    Views的补充
    Form表单组件验证
    django信号相关
    缓存实例
    自定义django中间件
    【主机管理项目】-(路由表)
  • 原文地址:https://www.cnblogs.com/book-gary/p/4230229.html
Copyright © 2011-2022 走看看