您的位置:首页 > 移动开发 > IOS开发

重叠ioserver.cpp

2008-01-14 15:23 183 查看
// 重叠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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: