|
之前做了个基于C—S的数据包传输测试,结果在单机上表现良好,基本上10M以内的文件均无丢包的情况发生,但将程序移到局域网上,多台机器之间进行测试,却出现严重的丢包。究其原因,还请各位大侠不吝才赐教。代码如下:
服务器:
#include <stdio.h>
#include <tchar.h>
#include <ace/Acceptor.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/SOCK_Stream.h>
#include <ace/Svc_Handler.h>
static const char * filename = "bigfile.dat";
class ACEServer : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
{
typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> super;
public:
ACEServer() {
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Create New ACEServer\n"));
};
public:
virtual ~ACEServer() {
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Destory ACEServer\n"));
};
virtual int open(void *p){
if((file = fopen(filename, "rb")) == NULL) {
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Failed to open file\n"));
return -1;
}
total = 0;
ACE_DEBUG ((LM_DEBUG,"(%P|%t) New Client Connection\n"));
ACE_Reactor::instance()->register_handler(this,
ACE_Event_Handler::WRITE_MASK);
return super::open(p);
}
protected:
virtual int handle_output(ACE_HANDLE) {
size_t count = fread(block, sizeof(char), sizeof(block), file);
if(count <= 0) {
ACE_DEBUG ((LM_DEBUG,"\n(%P|%t) Send Finished!\n"));
fclose(file);
file = NULL;
return -1;
}
this->peer().send(block, count);
total += count;
ACE_DEBUG((LM_DEBUG, ".", total));
return 1;
}
private:
char block[4096];//以4K为单位
FILE *file;
size_t total;
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef ACE_Acceptor<ACEServer, ACE_SOCK_ACCEPTOR> MyServer;
ACE_INET_Addr address(12345);
MyServer server;
if(server.open(address) == -1) {
ACE_DEBUG((LM_DEBUG, "(%P|%t) Failed to Create Server\n"));
return -1;
}
ACE_Reactor::instance()->run_reactor_event_loop();
return 0;
}
客户端:
#include <stdio.h>
#include <tchar.h>
#include <ace/Connector.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>
#include <ace/Svc_Handler.h>
class ACEClient : public ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH>
{
typedef ACE_Svc_Handler<ACE_SOCK_STREAM, ACE_NULL_SYNCH> super;
public:
ACEClient() {
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Create New ACEClient\n"));
};
public:
virtual ~ACEClient() {
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Destory ACEClient\n"));
};
virtual int open(void *p){
total = 0;
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Connected to Server\n"));
return super::open(p);
}
protected:
virtual int handle_input(ACE_HANDLE) {
int count = this->peer().recv(block, sizeof(block));
if(count > 0) {
total += count;
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Received %d bytes\n", total));
return 0;
}
if(count == 0 && ACE_OS::last_error() != EWOULDBLOCK) {
ACE_Reactor::instance()->end_reactor_event_loop();
return -1;
}
ACE_DEBUG ((LM_DEBUG,"(%P|%t) Received %d bytes\n", total));
return 0;
}
private:
char block[4096];
size_t total;
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef ACE_Connector<ACEClient, ACE_SOCK_CONNECTOR> MyClient;
ACE_INET_Addr address(12345, "192.35.168.1");
MyClient client;
ACEClient c;
ACEClient *pc = &c;
if(client.connect(pc, address) == -1) {
ACE_DEBUG((LM_DEBUG, "(%P|%t) Failed to connect server!\n"));
return -1;
}
ACE_Reactor::instance()->run_reactor_event_loop();
return 0;
} |
|