自己写一个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。
一直找不到原因!!!
请高手指点!!!!
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。
一直找不到原因!!!
请高手指点!!!!
解决方案 »
- 请教:如何取得当前新创建的Excel进程ID
- wglSwapBuffers需要包含哪个头文件呀?
- 初学者的扩展MFC DLL错误。
- 客户端接受不到消息的问题?
- CListCtrl中如何通过程序设置某个项被选中?在线等!
- 在vc中如何实现每编译一次就自动更新文件版本号-FILEVERSION (100分)
- *******************DLL的调用方法,急********************
- 线程问题
- Ado 删除出错的问题
- 用VC怎么实现屏幕抓取??
- 开机自动启动程序的 GetCurrentDirectory获取路径问题
- API Hook CreateFile将返回值替代后为什么不能正常使用?
pServ->m_sListen在while中为空值,在循环前是有值的,何解???
你把SOCKET sListen = pServ->m_sListen;屏蔽掉看看
我用了: int nRet = WSAEventSelect(m_sListen, m_hEvent, FD_ACCEPT);
if(SOCKET_ERROR == nRet)
{
AfxMessageBox("WSAEventSelect() 失败"); return FALSE;
}
m_sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
初始化时, 不指定重叠IO标志;