ACE学习笔记(3)——第二个例子:UDP
下载了《ACE自适配通信环境中文技术文档》,很不错,感谢马维达同志。
从中篇第二章开始看,按照上一篇的方法将数据报的代码放入项目编译、运行,发现几个
问题:
1. 服务端收不到消息,检查客户端发现发送失败,追查下去,可能由于ACE的版本更新,
按原来的写法在远端地址初始化时出现了问题,给地址时应该以"IP:Port"的方式给出。
2. 客户端发送成功后,服务端成功收到并回执,但是客户端没收到。检查后,发现是客
户端接收长度不够,将SIZE_DATA改成29就行了。
3. 继续调试,发现客户端第二次发送时,服务端突然退出了。一检查,由于客户端将新
收下的字符串发送出去了,超过了第一次发送的字符串的长度,服务器接收失败。因此,需要
在客户端接收成功后,重新设置需要发送的字符串。
下面是修改过的代码:
1
//Server
2
#include "ace/OS.h"
3
#include "ace/SOCK_Dgram.h"
4
#include "ace/INET_Addr.h"
5
#include "ace/Log_Msg.h"
6
7
#ifndef _DEBUG
8
#pragma comment( lib, "ace.lib" )
9
#else
10
#pragma comment( lib, "aced.lib" )
11
#endif
12
13
#define DATA_BUFFER_SIZE 1024
14
#define SIZE_DATA 19
15
16
class Server
17
{
18
public:
19
Server(int local_port)
20
:local_addr_(local_port),local_(local_addr_)
21
{
22
data_buf = new char[DATA_BUFFER_SIZE];
23
}
24
25
26
//Expect data to arrive from the remote machine. Accept it and display
27
//it. After receiving data, immediately send some data back to the
28
//remote.
29
int accept_data()
30
{
31
int byte_count=0;
32
while( (byte_count=local_.recv(data_buf,SIZE_DATA,remote_addr_))!=-1)
33
{
34
data_buf[byte_count]=0;
35
ACE_DEBUG((LM_DEBUG, "Data received from remote %s was %s \n"
36
,remote_addr_.get_host_name(), data_buf));
37
ACE_OS::sleep(1);
38
if(send_data()==-1) break;
39
}
40
return -1;
41
}
42
43
//Method used to send data to the remote using the datagram component
44
//local_
45
int send_data()
46
{
47
ACE_DEBUG((LM_DEBUG,"Preparing to send reply to client %s:%d\n",
48
remote_addr_.get_host_name(),remote_addr_.get_port_number()));
49
ACE_OS::sprintf(data_buf,"Server says hello to you too");
50
if( local_.send(data_buf, ACE_OS::strlen(data_buf)+1,remote_addr_)==-1)
51
return -1;
52
else
53
return 0;
54
}
55
56
private:
57
char *data_buf;
58
ACE_INET_Addr remote_addr_;
59
ACE_INET_Addr local_addr_;
60
ACE_SOCK_Dgram local_;
61
};
62
63
64
int main(int argc, char *argv[])
65
{
66
if(argc<2)
67
{
68
ACE_DEBUG((LM_DEBUG,"Usage %s <Port Number>", argv[0]));
69
ACE_OS::exit(1);
70
}
71
Server server(ACE_OS::atoi(argv[1]));
72
server.accept_data();
73
return 0;
74
}
75![]()
//Server2
#include "ace/OS.h"3
#include "ace/SOCK_Dgram.h"4
#include "ace/INET_Addr.h"5
#include "ace/Log_Msg.h"6
7
#ifndef _DEBUG8
#pragma comment( lib, "ace.lib" )9
#else 10
#pragma comment( lib, "aced.lib" )11
#endif12
13
#define DATA_BUFFER_SIZE 102414
#define SIZE_DATA 1915
16
class Server17
{18
public:19
Server(int local_port)20
:local_addr_(local_port),local_(local_addr_)21
{22
data_buf = new char[DATA_BUFFER_SIZE];23
}24
25
26
//Expect data to arrive from the remote machine. Accept it and display27
//it. After receiving data, immediately send some data back to the28
//remote.29
int accept_data()30
{31
int byte_count=0;32
while( (byte_count=local_.recv(data_buf,SIZE_DATA,remote_addr_))!=-1)33
{34
data_buf[byte_count]=0;35
ACE_DEBUG((LM_DEBUG, "Data received from remote %s was %s \n"36
,remote_addr_.get_host_name(), data_buf));37
ACE_OS::sleep(1);38
if(send_data()==-1) break;39
}40
return -1;41
}42
43
//Method used to send data to the remote using the datagram component44
//local_45
int send_data()46
{47
ACE_DEBUG((LM_DEBUG,"Preparing to send reply to client %s:%d\n",48
remote_addr_.get_host_name(),remote_addr_.get_port_number()));49
ACE_OS::sprintf(data_buf,"Server says hello to you too");50
if( local_.send(data_buf, ACE_OS::strlen(data_buf)+1,remote_addr_)==-1)51
return -1;52
else53
return 0;54
}55
56
private:57
char *data_buf;58
ACE_INET_Addr remote_addr_;59
ACE_INET_Addr local_addr_;60
ACE_SOCK_Dgram local_;61
};62
63
64
int main(int argc, char *argv[])65
{66
if(argc<2)67
{68
ACE_DEBUG((LM_DEBUG,"Usage %s <Port Number>", argv[0]));69
ACE_OS::exit(1);70
}71
Server server(ACE_OS::atoi(argv[1]));72
server.accept_data();73
return 0;74
}75

1
//Client
2
#include "ace/OS.h"
3
#include "ace/SOCK_Dgram.h"
4
#include "ace/INET_Addr.h"
5
#include "ace/Log_Msg.h"
6
7
#ifndef _DEBUG
8
#pragma comment( lib, "ace.lib" )
9
#else
10
#pragma comment( lib, "aced.lib" )
11
#endif
12
13
#define DATA_BUFFER_SIZE 1024
14
#define SIZE_DATA 29
15
16
class Client
17
{
18
public:
19
Client(char * remote_host)
20
:remote_addr_(remote_host),
21
local_addr_((u_short)0),local_(local_addr_)
22
{
23
data_buf = new char[DATA_BUFFER_SIZE];
24
//remote_addr_.set_port_number(port);
25
}
26
27
//Receive data from the remote host using the datgram wrapper `local_’.
28
//The address of the remote machine is received in `remote_addr_’
29
//which is of type ACE_INET_Addr. Remember that there is no established
30
//connection.
31
int accept_data()
32
{
33
if(local_.recv(data_buf,SIZE_DATA,remote_addr_)!=-1)
34
{
35
ACE_DEBUG((LM_DEBUG, "Data received from remote server %s was: %s \n" ,
36
remote_addr_.get_host_name(), data_buf));
37
return 0;
38
}
39
else
40
return -1;
41
}
42
43
//Send data to the remote. Once data has been sent wait for a reply
44
//from the server.
45
int send_data()
46
{
47
ACE_DEBUG((LM_DEBUG,"Preparing to send data to server %s:%d\n",
48
remote_addr_.get_host_name(),remote_addr_.get_port_number()));
49
ACE_OS::sprintf(data_buf,"Client says hello");
50
51
while(local_.send(data_buf,ACE_OS::strlen(data_buf),remote_addr_)!=-1)
52
{
53
ACE_OS::sleep(1);
54
if(accept_data()==-1)
55
break;
56
ACE_OS::sprintf(data_buf,"Client says hello");
57
}
58
59
return -1;
60
}
61
62
private:
63
char *data_buf;
64
ACE_INET_Addr remote_addr_;
65
ACE_INET_Addr local_addr_;
66
ACE_SOCK_Dgram local_;
67
};
68
69
int main(int argc, char *argv[])
70
{
71
if(argc<2)
72
{
73
ACE_OS::printf("Usage: %s <hostname:port_number> \n", argv[0]);
74
ACE_OS::exit(1);
75
}
76
Client client(argv[1]);
77
client.send_data();
78
system("pause");
79
return 0;
80
}
//Client2
#include "ace/OS.h"3
#include "ace/SOCK_Dgram.h"4
#include "ace/INET_Addr.h"5
#include "ace/Log_Msg.h"6
7
#ifndef _DEBUG8
#pragma comment( lib, "ace.lib" )9
#else 10
#pragma comment( lib, "aced.lib" )11
#endif12
13
#define DATA_BUFFER_SIZE 102414
#define SIZE_DATA 2915
16
class Client17
{18
public:19
Client(char * remote_host)20
:remote_addr_(remote_host),21
local_addr_((u_short)0),local_(local_addr_)22
{23
data_buf = new char[DATA_BUFFER_SIZE];24
//remote_addr_.set_port_number(port);25
}26
27
//Receive data from the remote host using the datgram wrapper `local_’.28
//The address of the remote machine is received in `remote_addr_’29
//which is of type ACE_INET_Addr. Remember that there is no established30
//connection.31
int accept_data()32
{33
if(local_.recv(data_buf,SIZE_DATA,remote_addr_)!=-1)34
{35
ACE_DEBUG((LM_DEBUG, "Data received from remote server %s was: %s \n" ,36
remote_addr_.get_host_name(), data_buf));37
return 0;38
}39
else40
return -1;41
}42
43
//Send data to the remote. Once data has been sent wait for a reply44
//from the server.45
int send_data()46
{47
ACE_DEBUG((LM_DEBUG,"Preparing to send data to server %s:%d\n",48
remote_addr_.get_host_name(),remote_addr_.get_port_number()));49
ACE_OS::sprintf(data_buf,"Client says hello");50
51
while(local_.send(data_buf,ACE_OS::strlen(data_buf),remote_addr_)!=-1)52
{53
ACE_OS::sleep(1);54
if(accept_data()==-1)55
break;56
ACE_OS::sprintf(data_buf,"Client says hello");57
}58
59
return -1;60
}61
62
private:63
char *data_buf;64
ACE_INET_Addr remote_addr_;65
ACE_INET_Addr local_addr_;66
ACE_SOCK_Dgram local_;67
};68
69
int main(int argc, char *argv[])70
{71
if(argc<2)72
{73
ACE_OS::printf("Usage: %s <hostname:port_number> \n", argv[0]);74
ACE_OS::exit(1);75
}76
Client client(argv[1]);77
client.send_data();78
system("pause");79
return 0;80
}

浙公网安备 33010602011771号