📄 main.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 + -