//AfxBeginThread(CEveSock::AcceptProc,(LPVOID)&Accept); } if (Events.lNetworkEvents & FD_READ) { if (Events.iErrorCode[FD_READ_BIT] != 0) { break; } // Read data from the socket
recv(SocketArray[Index],buffer,sizeof(buffer),0);
TRACE("READ"); } if (Events.lNetworkEvents & FD_CLOSE) { if (Events.iErrorCode[FD_CLOSE_BIT] != 0) { break; } CleanSocket(Index); } } } return TRUE;
因为还没有client发数据给你现在。你可以写一个client,发送数据给你选择的这个程序。应该就会有信号了。参考:
Windows Socket五种I/O模型——代码全攻略(一)(转)
http://hi.baidu.com/xyh2007/blog/item/7f2ebf3de1e69e07bba1674e.html
我有一个客户端的程序发送数据的,只是我在FD_READ中再开个线程进行接收文件
代码是
DWORD Index, i; WSANETWORKEVENTS Events;
char buffer[4096];
SOCKET Accept;
Index = WSAWaitForMultipleEvents(EventTotal,
EventArray, FALSE, 300, FALSE);
if (WSA_WAIT_TIMEOUT==Index||WSA_WAIT_FAILED==Index)
{
return FALSE;
}
Index = Index - WSA_WAIT_EVENT_0;
for(i=Index; i < EventTotal ;i++)
{
Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 300,
FALSE);
if ((Index == WSA_WAIT_FAILED) || (Index == WSA_WAIT_TIMEOUT))
{
continue;
}
else
{
Index = i;
WSAEnumNetworkEvents(SocketArray[Index],EventArray[Index], &Events);
if (Events.lNetworkEvents & FD_ACCEPT)
{
if (Events.iErrorCode[FD_ACCEPT_BIT] != 0)
{
break;
}
// Accept a new connection, and add it to the
// socket and event lists
Accept = accept(SocketArray[Index], NULL, NULL);
if (Accept==INVALID_SOCKET)
{
WSACleanup();
return FALSE;
}
// WSA_MAXIMUM_WAIT_EVENTS sockets, so close the accepted socket
if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
//printf("Too many connections");
closesocket(Accept);
break;
}
NewEvent = WSACreateEvent();
WSAEventSelect(Accept, NewEvent,
FD_READ| FD_CLOSE);
EventArray[EventTotal] = NewEvent;
SocketArray[EventTotal] = Accept;
EventTotal++;
//AfxBeginThread(CEveSock::AcceptProc,(LPVOID)&Accept);
}
if (Events.lNetworkEvents & FD_READ)
{
if (Events.iErrorCode[FD_READ_BIT] != 0)
{
break;
}
// Read data from the socket
recv(SocketArray[Index],buffer,sizeof(buffer),0);
TRACE("READ");
}
if (Events.lNetworkEvents & FD_CLOSE)
{
if (Events.iErrorCode[FD_CLOSE_BIT] != 0)
{
break;
}
CleanSocket(Index);
}
}
} return TRUE;
但是如果在FD_READ中 如果AFXBEGINTHREAD 好象就什么数据都收不到了
对于小数量的连接 还是select模型传的快 以前写过一个SELECT 模型的 就是select之后 accept客户端 然后马上开线程在里面做循环读数据
Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, 300, FALSE);
Index = WSAWaitForMultipleEvents(1, &EventArray[i], TRUE, 300, FALSE); 其实只要第一句话就可以根据WSAWaitForMultipleEvents函数的返回值来判断是哪个socket有响应请求
我觉得第一句的WSAWaitForMultipleEvents有问题,因为在这个等待之前EventArray里面并没有实际的事件对象
不知道这样行不行
被触发事件的下标(用返回值-WSA_WAIT_EVENT_0)找对应的事件