如何使用WINDOWS API中的WSAAsyncSelect.....
是在LISTEN函数前调用,还是在ACCEPT前调用啊....
能给出个确切方法吗?
如何使用WINDOWS API中的WSAAsyncSelect.....
是在LISTEN函数前调用,还是在ACCEPT前调用啊....
能给出个确切方法吗?
Public Const SOL_SOCKET = &HFFFF
Public Const SO_LINGER = &H80
Public Const FD_READ = &H1
Public Const FD_WRITE = &H2
Public Const FD_OOB = &H4
Public Const FD_ACCEPT = &H8
Public Const FD_CONNECT = &H10
Public Const FD_CLOSE = &H20
......
SelectOps = FD_READ Or FD_WRITE Or FD_CLOSE Or FD_ACCEPT
WSAAsyncSelect(sock, Me.hWnd, network_event, ByVal SelectOps)
下面是C++的解释 我尝试过 在C++ 中可行,但是照搬VB却产生了错误 INET能连接上 局域网却无法连接.连接上了发送消息却无法接受... 我不知道是不是自己翻译错了 请大家帮忙翻译一下 在这里先谢谢大家了...
void OnNetEvent(WPARAM wParam, LPARAM lParam)
{
file://调用API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
file://得到发出此事件的客户端套接字
SOCKET pSock = (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: file://客户端连接请求
{
OnAccept();
break;
}
case FD_CLOSE: file://客户端断开事件:
{
OnClose(pSock);
break;
}
case FD_READ: file://网络数据包到达事件
{
OnReceive(pSock);
break;
}
case FD_WRITE: file://发送网络数据事件
{
OnSend(pSock);
break;
}
default: break;
}
}
void OnAccept(SOCET pSock) file://响应客户端连接请求函数
{
int len = sizeof(sockaddr);
file://调用API函数,接受连接,并返回一个新套接字
file://还可以获得客户端的IP地址
SOCKET clientSocket = accept(serverSocket,
(struct sockaddr*)&clientaddr, &len);
file://为新的socket注册异步事件,注意没有Accept事件
if(WSAAsyncSelect(clientSocket ,m_hWnd, IP_EVENT,
FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox("注册异步事件失败!");
return;
}
file://自编函数,将此客户端的相关信息保存下来:套接字、
// IP地址、登陆时间
saveClientSocket(clientSocket,clientAddr,currentTimer);
}
void OnClose(SOCET pSock)
{
file://自编函数,结束与相应的客户端的通信,释放相应资源并做相应处理
endClientSocket(pSock);
}
void OnSend(SOCET pSock)
{
file://自编函数,在给客户端发数据时做一些预处理
handleOnSend(pSock);
}
void OnReceive(SOCET pSock)
{
recv(...); file://调用API函数,读出网络缓冲区中的数据包
file://自编函数,将此数据包和发出此数据的客户端
buildNetMsg(...);
file://自编函数,将此网络消息放入一个消息队列中,由工作线程去处理
saveNetMsg(...);
SetEvent(...); file://用事件对象触发工作线程
}
[此贴子已经被作者于2006-9-8 10:31:52编辑过]