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

📄 main.cpp

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

//#define CLIENT_RUN_CONNECT
#define CLIENT_RUN_DATA

class EchoClient:public IOCPNetClient
{
protected:
  virtual void iocp_open_handler(SOCKET s);
  virtual void iocp_closed_handler(SOCKET s);
  virtual void iocp_message_handler(SOCKET s,NetMessage *m);
  virtual void iocp_illegal_handler(SOCKET s,int len);
};
#define kbcheck(a) \
  if(kbhit()) \
{ \
  int k=getch(); \
  if(k==a) \
  break; \
}else

static set<SOCKET> ss;
static int socknum=0;
static int sendlen=0;
static int recvlen=0;

static void printdata(const char *id,SOCKET s,char *buf,int len)
{
  cout<<id<<""<<s<<"len="<<len<<"(";
  for(int i=0;i<len;++i)
  {
    cout<<buf[i];
  }
  cout<<")\n";
}

void EchoClient::iocp_open_handler(SOCKET s)
{
  pair<set<SOCKET>::iterator,bool> ret;
  ret=ss.insert(s);
  assert(ret.second);
  ++socknum;
  cout<<"open socket "<<s<<" num=("<<socknum<<","<<ss.size()<<")\n";
}
void EchoClient::iocp_closed_handler(SOCKET s)
{
  set<SOCKET>::iterator iter;
  iter=ss.find(s);
  assert(iter!=ss.end());
  ss.erase(s);
  --socknum;
  cout<<"closed socket "<<s<<" num=("<<socknum<<","<<ss.size()<<")\n";
}
void EchoClient::iocp_message_handler(SOCKET s,NetMessage *m)
{
  printdata("recv",s,m->data,m->datalen);
  recvlen+=m->datalen;
}
void EchoClient::iocp_illegal_handler(SOCKET s,int len)
{
  ofstream f("illegal.txt",ios::app);
  if(f)
  {
    f<<"socket "<<s<<" len "<<len<<"\n";
  }
  cout<<"warning !!! illegal message !\n";
}

EchoClient *net=NULL;
static void fill_message(NetMessage *m)
{
  int max_len=min(64,NET_MESSAGE_SIZE);
  int r=((unsigned int )rand())%max_len+1;
  //int r=((unsigned int )rand())%NET_MESSAGE_SIZE+1;
  m->datalen=r;
  for(int i=0;i<r;++i)
  {
    m->data[i]='a'+((unsigned int)rand())%('z'-'a'+1);
  }
}

#ifdef CLIENT_RUN_DATA
void client_logic()
{
  static bool first=true;
  if(first)
  {
    if(!net->connect(TEST_DOTIP,TEST_PORT,NULL))
    {
      cout<<"connect fail! socknum="<<socknum<<"\n";
      Sleep(100);
    }
    first=false;
  }
  if(!ss.empty())
  {
    SOCKET s=*ss.begin();
    NetMessage *m=new NetMessage;
    fill_message(m);
    sendlen+=m->datalen;
    printdata("send",s,m->data,m->datalen);
    net->sendmessage(s,m);
  }
}
#endif
#ifdef CLIENT_RUN_CONNECT
void client_logic()
{
  int r=((unsigned int)rand())%10;
  if(r<5)
  {
    if(!net->connect(TEST_DOTIP,TEST_PORT,NULL))
    {
      cout<<"connect fail! socknum="<<socknum<<"\n";
      Sleep(100);
    }
  }
  else if(r<9)
  {
    if(!ss.empty())
    {
      SOCKET s=*ss.begin();
      net->close(s);
      Sleep(100);
    }
  }
  else
  {
    if(!ss.empty())
    {
      SOCKET s=*ss.begin();
      NetMessage *m=new NetMessage;
      fill_message(m);
      sendlen+=m->datalen;
      printdata("send",s,m->data,m->datalen);
      net->sendmessage(s,m);
    }
  }
}
#endif

void main()
{
  net=new EchoClient;
  net->start();
  srand(time(0));
  while(1)
  {
    net->runloop();
    client_logic();
    kbcheck(' ');
    cout<<"total send and recv ("<<sendlen<<","<<recvlen<<")\n";
  }
  cout<<"shutdown !!! ...\n";
  for(int i=0;i<10;++i)
  {
    net->runloop();
    cout<<"total send and recv ("<<sendlen<<","<<recvlen<<")\n";
    Sleep(1000);
    kbcheck(' ');
  }
  set<SOCKET>::iterator iter;
  for(iter=ss.begin();iter!=ss.end();++iter)
  {
    net->close(*iter);
    cout<<"closing socket "<<*iter<<" socknum="<<socknum<<"\n";
    kbcheck(' ');
  }
  for(int i=0;i<10;++i)
  {
    net->runloop();
    cout<<"total send and recv ("<<sendlen<<","<<recvlen<<")\n";
    Sleep(1000);
    kbcheck(' ');
  }
  cout<<"total send and recv ("<<sendlen<<","<<recvlen<<")\n";
  delete net;
  cout<<"total send and recv ("<<sendlen<<","<<recvlen<<")\n";
  cout<<"socknum="<<socknum;
  cout<<"end";
  system("pause");
}

⌨️ 快捷键说明

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