下载了《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![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
62
![](/Images/OutliningIndicators/None.gif)
63
![](/Images/OutliningIndicators/None.gif)
64
![](/Images/OutliningIndicators/None.gif)
65
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
75
![](/Images/OutliningIndicators/None.gif)
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
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/None.gif)
6
![](/Images/OutliningIndicators/None.gif)
7
![](/Images/OutliningIndicators/None.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/None.gif)
12
![](/Images/OutliningIndicators/None.gif)
13
![](/Images/OutliningIndicators/None.gif)
14
![](/Images/OutliningIndicators/None.gif)
15
![](/Images/OutliningIndicators/None.gif)
16
![](/Images/OutliningIndicators/None.gif)
17
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/InBlock.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/InBlock.gif)
60
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
61
![](/Images/OutliningIndicators/InBlock.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
68
![](/Images/OutliningIndicators/None.gif)
69
![](/Images/OutliningIndicators/None.gif)
70
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)