udp是一種無連接的協(xié)議,提供無連接不可靠的服務(wù)。
在ace中,通過ACE_SOCK_Dgram類提供udp通信服務(wù),ACE_SOCK_Dgram和ACE_SOCK_Stream的API非常類似,一樣提供了send,recv及close等常用操作,這里就不再累述了。
udp通信時(shí)無需像tcp那樣建立連接和關(guān)閉連接,tcp編程時(shí)需要通過accept和connect來建立連接,而udp通信省略了這一步驟,相對來說編程更為簡單。
由于udp通信時(shí)無建立連接,服務(wù)器端不能像Tcp通信那樣在建立連接的時(shí)候就獲得客戶端的地址信息,故服務(wù)器端不能主動(dòng)對客戶端發(fā)送信息(不知道客戶端的地址),只有等到收到客戶端發(fā)送的udp信息時(shí)才能確定客戶端的地址信息,從而進(jìn)行通信。
udp通信過程如下:
- 服務(wù)器端綁定一固定udp端口,等待接收客戶端的通信。
- 客戶端通過服務(wù)器的ip和地址信息直接對服務(wù)器端發(fā)送消息。
- 服務(wù)器端收到客戶端發(fā)送的消息后獲取客戶端的ip和端口信息,通過該地址信息和客戶端通信。
下面代碼為EchoServer的udp版:
1 //server.cpp
2 #include <ace/SOCK_Dgram.h>
3 #include <ace/INET_Addr.h>
4 #include <ace/Time_Value.h>
5
6 #include <string>
7 #include <iostream>
8 using namespace std;
9
10 int main(int argc, char *argv[])
11 {
12 ACE_INET_Addr port_to_listen(3000); //綁定的端口
13 ACE_SOCK_Dgram peer(port_to_listen); //通信通道
14
15 char buf[100];
16 while(true)
17 {
18 ACE_INET_Addr remoteAddr; //所連接的遠(yuǎn)程地址
19 int bc = peer.recv(buf,100,remoteAddr); //接收消息,獲取遠(yuǎn)程地址信息
20 if( bc != -1)
21 {
22 string s(buf,bc);
23 cout<<endl<<"rev:\t"<<s<<endl;
24 }
25 peer.send(buf,bc,remoteAddr); //和遠(yuǎn)程地址通信
26 }
27
28 return 0;
29 }
30
31
相應(yīng)的客戶端程序如下:
1 //client.cpp
2 #include <ace/SOCK_Dgram.h>
3 #include <ace/INET_Addr.h>
4 #include <ace/Time_Value.h>
5
6 #include <string>
7 #include <iostream>
8 using namespace std;
9
10 int main(int argc, char *argv[])
11 {
12 ACE_INET_Addr remoteAddr(3000,"127.0.0.1"); //所連接的遠(yuǎn)程地址
13 ACE_INET_Addr localAddr; //本地地址信息
14
15 ACE_SOCK_Dgram peer(localAddr); //通信通道
16
17 peer.send("hello",5,remoteAddr); //發(fā)送消息
18
19 char buf[100];
20 int bc = peer.recv(buf,100,remoteAddr); //接收消息
21 if( bc != -1)
22 {
23 string s(buf,bc);
24 cout<<endl<<"rev:\t"<<s<<endl;
25 }
26
27 return 0;
28 }
和tcp編程相比,udp無需通過acceptor,connector來建立連接,故代碼相對tcp編程來說要簡單許多。另外,由于udp是一種無連接的通信方式,ACE_SOCK_Dgram的實(shí)例對象中無法保存遠(yuǎn)端地址信息(保存了本地地址信息),故通信的時(shí)候需要加上遠(yuǎn)端地址信息。
posted on 2009-08-28 14:38
老馬驛站 閱讀(594)
評論(0) 編輯 收藏 引用 所屬分類:
ACE