找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 2865|回复: 0

请教在局域网通信问题

[复制链接]
发表于 2008-7-20 08:23:46 | 显示全部楼层 |阅读模式
之前做了个基于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;
}
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 17:26 , Processed in 0.016060 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表