⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 基于完成端口的TCP网络通信框架实现 工程iocp中包含了框架实现的所有代码
💻 CPP
字号:
#include <string>
#include <iostream>
#include <fstream>
#include <conio.h>
#include "iocp.h"
#include "config.h"
using namespace std;

#define DEBUG_MsgIOCPServer
//#define DEBUG_NetIOCPServer


#ifdef DEBUG_MsgIOCPServer
class MsgIOCPTestServer:public MsgIOCPServer
{
public:
  explicit MsgIOCPTestServer(unsigned short port)
    :MsgIOCPServer(port)
  {
  }
protected:
  virtual void msg_open_handler(SOCKET s);
  virtual void msg_closed_handler(SOCKET s);
  virtual void msg_message_handler(SOCKET s,NetMessage *msg);
  virtual void msg_illegal_handler(SOCKET s,int msglen);
};

static int socknum=0;
void MsgIOCPTestServer::msg_open_handler(SOCKET s)
{
  ++socknum;
  cout<<"new socket"<<s<<"number="<<socknum<<"\n";
}
void MsgIOCPTestServer::msg_closed_handler(SOCKET s)
{
  --socknum;
  cout<<"close socket"<<s<<"number="<<socknum<<"\n";
}
void MsgIOCPTestServer::msg_illegal_handler(SOCKET s,int msglen)
{
  cout<<"ill message!!!!!!!!!!!!!!!!";
}
void MsgIOCPTestServer::msg_message_handler(SOCKET s,NetMessage *msg)
{
  NetMessage *newmsg=new NetMessage;
  cout<<"recv"<<s<<"len="<<msg->datalen<<"(";
  for(int i=0;i<msg->datalen;++i)
  {
    cout<<msg->data[i];
  }
  cout<<")\n";
  memcpy(newmsg->data,msg->data,msg->datalen);
  newmsg->datalen=msg->datalen;
  ofstream f("iocp_recv.txt",ios::binary|ios::app);//f("../testmsg/debug/iocp_recv.txt",ios::binary|ios::app);
  if(f)
  {
    f.write(msg->data,msg->datalen);
    f.write("\n",1);
    f.close();
  }
  else
  {
    assert(0);
  }
  sendmessage(s,newmsg);
}

void main()
{
  MsgIOCPTestServer *server=new MsgIOCPTestServer(TEST_PORT);
  server->start();
  bool running=true;
  while(running)
  {
    server->runloop();
    if(kbhit())
    {
      int k=getch();
      if(k==' ')
        break;
    }
    Sleep(100);
  }
  delete server;
}

#endif


#ifdef DEBUG_NetIOCPServer

class NetIOCPTestServer:public NetIOCPServer
{
public:
  NetIOCPTestServer(unsigned short port)
    :NetIOCPServer(port)
  {
  }
protected:
  void net_open_handler(SOCKET s);
  void net_closed_handler(SOCKET s);
  void net_data_handler(PerIoData *data);
};

static map<SOCKET,void *> sets;
static int socknum=0;
void NetIOCPTestServer::net_open_handler(SOCKET s)
{
  typedef map<SOCKET,void *>::iterator MapIter;
  pair<MapIter,bool> ret;
  ret=sets.insert(make_pair(s,(void *)NULL));
  if(ret.second)
  {
    cout<<"new socket "<<s<<"\n";
  }
  else
  {
    assert(0);
    cout<<"new socket "<<s<<" already created!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
  }
  ++socknum;
  cout<<"socknum="<<socknum<<"\n";
}

void NetIOCPTestServer::net_closed_handler(SOCKET s)
{
  map<SOCKET,void *>::iterator iter;
  iter=sets.find(s);
  if(sets.end()!=iter)
  {
    sets.erase(iter->first);
    cout<<"close socket "<<s<<"\n";
  }
  else
  {
    assert(0);
    cout<<"close socket "<<s<<" already closed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
  }
  --socknum;
  cout<<"socknum="<<socknum<<"\n";
}

static int recvlen=0;
void NetIOCPTestServer::net_data_handler(PerIoData *data)
{
  //cout<<"recved socket "<<data->sock<<"len="<<data->len;
  //for(int i=0;i<data->len;++i)
  //{
  //  cout<<data->data[i];
  //}
  //cout<<"\n";
  ofstream f("../testnet/debug/iocp_recv.txt",ios::binary|ios::app);
  if(f)
  {
    f.write(data->data,data->len);
    f.write("\n",1);
    f.close();
  }
  else
  {
    assert(0);
  }
  PerIoData *iodata=new PerIoData;
  iodata->len=data->len;
  memcpy(iodata->data,data->data,data->len);
  recvlen+=iodata->len;
  senddata(data->sock,iodata);
  cout<<"recvlen="<<recvlen<<"\n";
}

void main()
{
  NetIOCPTestServer *server=new NetIOCPTestServer(TEST_PORT);
  server->start();
  bool running=true;
  while(running)
  {
    server->runloop();
    if(kbhit())
    {
      int k=getch();
      if(k==' ')
        break;
    }
    //Sleep(100);
  }
  delete server;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -