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             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]=\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!

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。