自己写一个IOCP的服务器端!遇到点麻烦~很奇怪的问题:创建套接字:
m_sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
if(INVALID_SOCKET == m_sListen)
{
AfxMessageBox("套接字创建失败"); return FALSE;
} sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(port);

//绑定,将监听端口绑定到本地地址
int bRet =  bind(m_sListen, (sockaddr*)&local,sizeof(local));
if(SOCKET_ERROR == bRet)
{
AfxMessageBox("套接字绑定失败"); return FALSE;
} int lRet = listen(m_sListen, SOMAXCONN);
if(SOCKET_ERROR == lRet)
{
AfxMessageBox("套接字监听失败"); return FALSE;
}创建accept线程
DWORD dwThreadID; m_hThread[0] = CreateThread(NULL, 0, AcceptThread, this, 0, &dwThreadID);问题出现在线程函数AcceptThreadDWORD WINAPI XIOCPServer::AcceptThread( void *pParam )
{

XIOCPServer *pServ = (XIOCPServer*)pParam;
SOCKET sListen = pServ->m_sListen; while(pServ->m_bRunning)
{
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1, &pServ->m_hEvent, FALSE, 100, FALSE); if(!pServ->m_bRunning)
break; if(dwRet == WSA_WAIT_TIMEOUT)
continue;

WSANETWORKEVENTS events;
                   /////////////这个函数的问题
int nRet = WSAEnumNetworkEvents(pServ->m_sListen, pServ->m_hEvent, &events);

                   //////////////这个函数的问题
if(nRet == SOCKET_ERROR)
{

int err = WSAGetLastError();
CString ttt;
ttt.Format("%d",err);
AfxMessageBox(ttt);                           ////////////WSAGetLastError为 10038,无效的套接字描述符???这个套接字我明明创建了
break;
}
} return 0;
}
当套接字描述符以参数传入线程函数,WSAEnumNetworkEvents老是返回10038,WSAENOTSOCK。
一直找不到原因!!!
请高手指点!!!!

解决方案 »

  1.   

    发现一个问题:
    pServ->m_sListen在while中为空值,在循环前是有值的,何解???
      

  2.   

    不是不是把它CLOSE掉了啊,
    你把SOCKET sListen = pServ->m_sListen;屏蔽掉看看
      

  3.   

    没有用WSASelectEvent来绑定event与socket
      

  4.   

    WSAEventSelect 和 WSASelectEvent 不一样?
    我用了: int nRet = WSAEventSelect(m_sListen, m_hEvent, FD_ACCEPT);
    if(SOCKET_ERROR == nRet)
    {
    AfxMessageBox("WSAEventSelect() 失败"); return FALSE;
    }
      

  5.   

    m_sListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); 
    m_sListen  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    初始化时, 不指定重叠IO标志;