大家好,我是新手我在对完成端口进行学习时遇到一个没有想明白的[来源:GameRes.com]问题望知道的达人指出小的不明白这处。先上一代伪代码
bool CNetServer::Create(int iPort)
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
CreateIoCompletionPort(INVALID_HANDLE_value, NULL, 0, 0 );
_beginthreadex(0, 0, WorkerThread , this, CREATE_SUSPENDED, &nThreadID);
//创建服务器
SOCKET ListenSocket;
struct sockaddr_in ServerAddress;
ListenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
ZeroMemory((char *)&ServerAddress, sizeof(ServerAddress));
ServerAddress.sin_family = AF_INET;
ServerAddress.sin_addr.s_addr = INADDR_ANY;
ServerAddress.sin_port = htons(iPort);
bind(ListenSocket, (struct sockaddr *) &ServerAddress, sizeof(ServerAddress)))
listen(ListenSocket, SOMAXCONN))
g_hAcceptThread = CreateThread(0, 0, AcceptThread, (void *)ListenSocket, 0, &nThreadID);
return true;
}
unsigned int __stdcall CNetServer::WorkerThread(LPVOID pParam)
{
while(true)
{
BOOL bReturn = GetQueuedCompletionStatus(
g_hIOCompletionPort,
&dwBytesTransfered,
(LPDWORD)&lpContext,
&pOverlapped,
INFINITE);
switch (pClientContext->GetOpCode())
{
case OP_READ:
{
//读到数据(此处得到的数据,可以送至应用屋处理)
//下次投递
nBytesRecv = WSARecv(pClientContext->GetSocket(), p_wbuf, 1,&dwBytes, &dwFlags, p_ol, NULL);
}
break;
case OP_WRITE:
{
//发送数据
nBytesSent = WSASend(pClientContext->GetSocket(), p_wbuf, 1, &dwBytes, dwFlags, p_ol, NULL);
}
break;
default:
break;
} //end switch
} //end while
}
Bool CNetServer::SendMsg(pClientContext->GetSocket(), pvoid Msg, int nSize)
{
PostQueuedCompletionStatus(OP_SEND);
}
Bool CNetServer::GetMsg()
{
}
以上是我初步构想…Getmsg()和SendMsg()为应用屋收发数据时的接口…请问这两个接口该怎么实现(),WorkerThread()线程在接收到数据时为主动推送…但我想由应用层来触发调用…我似乎对这个模型理解有误…忘大牛们解释一下。不甚感激…