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 }
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 }
ok!