// 重叠ioserver.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "重叠ioserver.h"
#include "winsock2.h"
#define DATA_BUFSIZE 256
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma comment(lib,"WS2_32")
/
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
WSADATA wsaData;
WSABUF wsaBuf;
char buffer[DATA_BUFSIZE];
DWORD dwEventTotal;
DWORD dwRecvBytes;
DWORD dwFlag;
DWORD dwTransferred;
WSAEVENT wsaEvent[WSA_MAXIMUM_WAIT_EVENTS];
WSAOVERLAPPED AcceptOverlapped;
SOCKET hSocketServer,hSocketAccept;
SOCKADDR_IN hAddrServer,hAddrClient;
int saRemoteLen;
int nRet;
nRet=WSAStartup(MAKEWORD(2,2),&wsaData);
if(nRet!=0)
{
cout<<"WSAStartup Failed!"<<endl;
return 0;
}
hAddrServer.sin_family=AF_INET;
hAddrServer.sin_port=htons(8888);
hAddrServer.sin_addr.s_addr=INADDR_ANY;
hSocketServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(hSocketServer==SOCKET_ERROR)
{
cout<<"create socket failed"<<endl;
return 0;
}
nRet=::bind(hSocketServer,(SOCKADDR*)&hAddrServer,sizeof(hAddrServer));
if(nRet!=0)
{
cout<<"bind failed!"<<endl;
return 0;
}
nRet=::listen(hSocketServer,5);
if(nRet!=0)
{
cout<<"listen failed"<<endl;
return 0;
}
saRemoteLen=sizeof(hAddrClient);
hSocketAccept=::WSAAccept(hSocketServer,(SOCKADDR*)&hAddrClient,&saRemoteLen,0,NULL);
cout<<"Client :"<<::inet_ntoa(hAddrClient.sin_addr)<<"connect"<<endl;
dwEventTotal=0;
wsaEvent[dwEventTotal]=::WSACreateEvent();
ZeroMemory(&AcceptOverlapped,sizeof(AcceptOverlapped));
wsaBuf.len=DATA_BUFSIZE;
wsaBuf.buf=buffer;
dwFlag=0;
dwEventTotal++;
if(WSARecv(hSocketAccept,&wsaBuf,1,&dwRecvBytes,&dwFlag,&AcceptOverlapped,NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
cout<<"error1"<<endl;
}
}
while(true)
{
DWORD dwIndex;
dwIndex=::WSAWaitForMultipleEvents(dwEventTotal,wsaEvent,FALSE,WSA_INFINITE,FALSE);
::WSAResetEvent(wsaEvent[dwIndex-WSA_WAIT_EVENT_0]);
::WSAGetOverlappedResult(hSocketAccept,&AcceptOverlapped,&dwTransferred,FALSE,&dwFlag);
if(dwTransferred==0)
{
cout<<"closing socket"<<hSocketAccept<<endl;
closesocket(hSocketAccept);
WSACloseEvent(wsaEvent[dwIndex-WSA_WAIT_EVENT_0]);
return 0;
}
cout<<"recv data from "<<hSocketAccept<<endl;
dwFlag=0;
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
AcceptOverlapped.hEvent=wsaEvent[dwIndex-WSA_WAIT_EVENT_0];
wsaBuf.len=DATA_BUFSIZE;
wsaBuf.buf=buffer;
if(::WSARecv(hSocketAccept,&wsaBuf,1,&dwRecvBytes,&dwFlag,&AcceptOverlapped,NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=WSA_IO_PENDING)
{
cout<<"error2"<<endl;
break;
}
}
}
::WSACleanup();
}
return nRetCode;
}