#include "EventOverlapped.h"
SocketArray EventOverlapped::socketArr_;
EventOverlapped::EventOverlapped(void)
:hThread(0), threadID(0)
{
socketArr_.totalEvents_ = 0;
socketArr_.hMutex = CreateMutex(NULL, FALSE, "socket");
if(socketArr_.hMutex == NULL)
{
throw ServerException();
}
for(int index = 0; index < WSA_MAXIMUM_WAIT_EVENTS; index++)
{
socketArr_.eventArray[index] = 0;
socketArr_.socketArray[index].socket_ = INVALID_SOCKET;
socketArr_.socketArray[index].recvBuf_.len = 0;
socketArr_.socketArray[index].recvBuf_.buf = NULL;
socketArr_.socketArray[index].sendBuf_.len = 0;
socketArr_.socketArray[index].sendBuf_.buf = NULL;
}
ServerFactory::Register("EVENTOVERLAPPED", this);
}
EventOverlapped::~EventOverlapped(void)
{
for(int index = 0; index < socketArr_.totalEvents_; index++)
{
WSACloseEvent(socketArr_.eventArray[index]);
socketArr_.eventArray[index] = 0;
shutdown(socketArr_.socketArray[index].socket_, SD_BOTH);
closesocket(socketArr_.socketArray[index].socket_);
socketArr_.socketArray[index].socket_ = INVALID_SOCKET;
socketArr_.socketArray[index].recvBuf_.len = 0;
delete []socketArr_.socketArray[index].recvBuf_.buf;
socketArr_.socketArray[index].recvBuf_.buf = NULL;
socketArr_.socketArray[index].sendBuf_.len = 0;
delete [] socketArr_.socketArray[index].sendBuf_.buf;
socketArr_.socketArray[index].sendBuf_.buf = NULL;
}
socketArr_.totalEvents_ = 0;
CloseHandle(socketArr_.hMutex);
CloseHandle(hThread);
}
int EventOverlapped::Initialize()
{
return ServerFactory::Initialize();
}
int EventOverlapped::Startup()
{
Initialize();
cout<<"Event Overlapped Server Started..."<<endl;
// Start thread to manipulate the overlap events
hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0,&threadID);
while(true)
{
SOCKADDR_IN clientAddr;
int len = sizeof(clientAddr);
// Accept a connect and lock the array
SOCKET acceptSocket = accept(listenSocket_, (SOCKADDR*)&clientAddr, &len);
if(acceptSocket != INVALID_SOCKET)
{
addArray(acceptSocket, clientAddr);
}
}
return 0;
}
DWORD WINAPI EventOverlapped::ThreadFunc(LPVOID pParam)
{
DWORD nRet = 0;
while(true)
{
nRet = WSAWaitForMultipleEvents(socketArr_.totalEvents_, socketArr_.eventArray, FALSE, INFINITE, FALSE);
if((nRet != WSA_WAIT_FAILED) && (nRet != WSA_WAIT_TIMEOUT))
{
DWORD index = nRet - WSA_WAIT_EVENT_0;
for(int ix = index; ix < socketArr_.totalEvents_; ix++)
{
nRet = WSAWaitForMultipleEvents(1, &socketArr_.eventArray[ix], TRUE, 20, FALSE);
if((nRet != WSA_WAIT_FAILED) && (nRet != WSA_WAIT_TIMEOUT))
{
// set the event to the state of no message
WSAResetEvent(socketArr_.eventArray[ix]);
DWORD recvBytes = 0, flag = 0;
// get the overlapped result
if(WSAGetOverlappedResult(socketArr_.socketArray[ix].socket_, &socketArr_.socketArray[ix].overlapped, &recvBytes, FALSE, &flag) == TRUE)
{
if(recvBytes <= 0)
{// socket was closed
compressArray(ix);
}
else
{// manipulate the message
manipulateMessage(ix);
}
}
else
{
int result = WSAGetLastError();
cout<<"An error occure by receive message("<<result<<")!"<<endl;
}
}// end if for single event
}// end for
}// end if for wait all events
}// end while
return 0;
}
void EventOverlapped::compressArray(int index)
{
WaitForSingleObject(socketArr_.hMutex, INFINITE);
cout<<"Socket ["<<socketArr_.socketArray[index].socketName_<<"] was closed!"<<endl;
shutdown(socketArr_.socketArray[index].socket_, SD_BOTH);
closesocket(socketArr_.socketArray[index].socket_);
WSACloseEvent(socketArr_.eventArray[index]);
socketArr_.socketArray[index].recvBuf_.len = 0;
delete []socketArr_.socketArray[index].recvBuf_.buf;
socketArr_.socketArray[index].recvBuf_.buf = NULL;
socketArr_.socketArray[index].sendBuf_.len = 0;
delete []socketArr_.socketArray[index].sendBuf_.buf;
socketArr_.socketArray[index].sendBuf_.buf = NULL;
for(int i = index; i < socketArr_.totalEvents_-1; i++)
{
socketArr_.socketArray[index] = socketArr_.socketArray[index+1];
socketArr_.eventArray[index] = socketArr_.eventArray[index+1] ;
}
socketArr_.totalEvents_--;
ReleaseMutex(socketArr_.hMutex);
}
void EventOverlapped::addArray(SOCKET &s, SOCKADDR_IN &clientAddr)
{
char strClientAddr[24];
memset(strClientAddr, 0, 24);
DWORD strLen = 24;
WaitForSingleObject(socketArr_.hMutex, INFINITE);
socketArr_.socketArray[socketArr_.totalEvents_].socket_ = s;
socketArr_.eventArray[socketArr_.totalEvents_] = WSACreateEvent();
ZeroMemory(&socketArr_.socketArray[socketArr_.totalEvents_].overlapped, sizeof(WSAOVERLAPPED));
socketArr_.socketArray[socketArr_.totalEvents_].overlapped.hEvent = socketArr_.eventArray[socketArr_.totalEvents_];
socketArr_.socketArray[socketArr_.totalEvents_].recvBuf_.len = BUFSIZE;
socketArr_.socketArray[socketArr_.totalEvents_].recvBuf_.buf = new char[BUFSIZE];
socketArr_.socketArray[socketArr_.totalEvents_].sendBuf_.len = BUFSIZE;
socketArr_.socketArray[socketArr_.totalEvents_].sendBuf_.buf = new char[BUFSIZE];
WSAAddressToString((SOCKADDR *)&clientAddr, sizeof(SOCKADDR_IN), NULL, strClientAddr, &strLen);
socketArr_.socketArray[socketArr_.totalEvents_].socketName_ = strClientAddr;
DWORD recvBytes = 0, flag = 0;
if(SOCKET_ERROR == WSARecv(s, &socketArr_.socketArray[socketArr_.totalEvents_].recvBuf_, 1,
&recvBytes, &flag,
&socketArr_.socketArray[socketArr_.totalEvents_].overlapped, NULL))
{
int result = WSAGetLastError();
if(result != WSA_IO_PENDING)
{
cout<<"Set a overlap recv manipulate failed("<<result<<")!"<<endl;
compressArray(socketArr_.totalEvents_);
}
else
{
cout<<"Accept a connet from ["<<strClientAddr<<"]..."<<endl;
socketArr_.totalEvents_++;
}
ReleaseMutex(socketArr_.hMutex);
}
else
{
ReleaseMutex(socketArr_.hMutex);
}
}
void EventOverlapped::manipulateMessage(int index)
{
cout<<socketArr_.socketArray[index].recvBuf_.buf<<endl;
memset(socketArr_.socketArray[index].recvBuf_.buf, 0, BUFSIZE);
// response it
time_t curtime = time(0);
tm sysTime;
localtime_s(&sysTime, &curtime);
int year = sysTime.tm_year + 1900;
int mon = sysTime.tm_mon + 1;
int day = sysTime.tm_mday;
int hour = sysTime.tm_hour;
int min = sysTime.tm_min;
int sec = sysTime.tm_sec;
sprintf_s(socketArr_.socketArray[index].sendBuf_.buf, BUFSIZE, "[%04d-%02d-%02d %02d:%02d:%02d]", year, mon, day, hour, min, sec);
strcat_s(socketArr_.socketArray[index].sendBuf_.buf, BUFSIZE, "I get you message!");
socketArr_.socketArray[index].sendBuf_.len = strlen(socketArr_.socketArray[index].sendBuf_.buf);
DWORD sendByTes = 0, flag = 0;
WSASend(socketArr_.socketArray[index].socket_, &socketArr_.socketArray[index].sendBuf_, 1, &sendByTes, flag, &socketArr_.socketArray[index].overlapped, NULL);
ZeroMemory(&socketArr_.socketArray[index].overlapped, sizeof(WSAOVERLAPPED));
socketArr_.socketArray[index].overlapped.hEvent = socketArr_.eventArray[index];
DWORD recvBytes = 0;
if(WSARecv(socketArr_.socketArray[index].socket_,
&socketArr_.socketArray[index].recvBuf_,
1, &recvBytes, &flag, &socketArr_.socketArray[index].overlapped,
NULL) == SOCKET_ERROR)
{
int result = WSAGetLastError();
if(result != WSA_IO_PENDING)
{
cout<<"Set a overlap recv manipulate failed("<<result<<")!"<<endl;
compressArray(index);
}
}
}
static EventOverlapped overlapped;
没有合适的资源?快使用搜索试试~ 我知道了~
Windows套接字I/O模型代码
共23个文件
cpp:9个
h:9个
suo:2个
3星 · 超过75%的资源 需积分: 13 13 下载量 161 浏览量
2010-06-11
23:14:53
上传
评论
收藏 29KB RAR 举报
温馨提示
包括Windows网络编程套接字I/O模型中的select模型,WSAEventSelect模型,重叠模型,完成端口模型完整代码。因为Windows 网络编程这本书上提供的代码并不完全正确,所以花了3天,写了几个例子。其中也包括了一些C++编程的小技巧。所有代码通过测试,但还是有些细节没去考虑,但是绝对是Windows socket服务器开发的好参考。在Microsoft visual studio 2008编译,测试,调试。
资源推荐
资源详情
资源评论
收起资源包目录
Server.rar (23个子文件)
Server
SelectServer.cpp 3KB
CompletionPort.h 691B
ComRoutineOverlap.cpp 6KB
SelectServer.suo 71KB
Server.vcproj.927FD523E79D474.Administrator.user 1KB
SocketInfo.cpp 3KB
Server.vcproj 5KB
Server.sln 877B
EventSelectServer.h 572B
config.h 291B
EventOverlapped.h 854B
EventSelectServer.cpp 5KB
ComRoutineOverlap.h 888B
ServerException.h 106B
EventOverlapped.cpp 8KB
SocketInfo.h 464B
ServerException.cpp 127B
ServerFactory.cpp 2KB
ServerFactory.h 708B
SelectServer.h 362B
Server.suo 7KB
CompletionPort.cpp 4KB
Server.cpp 1KB
共 23 条
- 1
资源评论
- zhangzhirong0002014-01-01代码一般般,但是要的分却不少,没什么看的
- huangkuangling2014-02-13代码普通,但是要的分挺高
xiqin
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功