首页 > 代码库 > ACE_linux:UDP通信

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]=\0;33             cout<<"[server rev]:>"<<buffer<<endl;34             if(strcmp(buffer, "quit") == 0)  35             {36                 break;  37             }38             39             //发送数据40             do41             {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         do25         {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]=\0;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!

技术分享

ACE_linux:UDP通信