代码如下:BOOL CServerDlg::InitSocket()//初始化套接字
{
m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("创建套接字失败!");
return FALSE;
} SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(PORT); if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
MessageBox("绑定失败!");
return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_ACCEPT|FD_CLOSE))
{
MessageBox("m_socket注册网络读取事件失败!");
return FALSE;
} if(SOCKET_ERROR==listen(m_socket,LISTEN_CONNBACKLOG))
{
MessageBox("监听失败!");
return FALSE;
}
return TRUE;
}void CServerDlg::OnSock(WPARAM wParam,LPARAM lParam)//消息响应函数
{
switch(WSAGETSELECTEVENT(lParam))//检查网络事件
{
case FD_ACCEPT://响应
if(sAccept=accept(wParam,NULL,NULL)==INVALID_SOCKET)
{
MessageBox("accept失败!");
break;
}
//这里出错!!!!!!!!!!!!!!!!!!!!!!!!!!
if(SOCKET_ERROR==WSAAsyncSelect(sAccept,m_hWnd,UM_SOCK,FD_READ|FD_CLOSE))
{
MessageBox("sAccept注册网络事件失败!");
return ;
}
//
break;
case FD_READ:
.......
在运行时会出现 :“sAccept注册网络事件失败!”
也就是在case FD_ACCPET 里面为新产生的sAccept注册FD_READ|FD_CLOSE时候,报错。为什么呢?我的本意是为每一个新生的accept套接字单独响应事件。
望高人赐教!谢谢!
{
m_socket=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(INVALID_SOCKET==m_socket)
{
MessageBox("创建套接字失败!");
return FALSE;
} SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(PORT); if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
MessageBox("绑定失败!");
return FALSE;
}
if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_ACCEPT|FD_CLOSE))
{
MessageBox("m_socket注册网络读取事件失败!");
return FALSE;
} if(SOCKET_ERROR==listen(m_socket,LISTEN_CONNBACKLOG))
{
MessageBox("监听失败!");
return FALSE;
}
return TRUE;
}void CServerDlg::OnSock(WPARAM wParam,LPARAM lParam)//消息响应函数
{
switch(WSAGETSELECTEVENT(lParam))//检查网络事件
{
case FD_ACCEPT://响应
if(sAccept=accept(wParam,NULL,NULL)==INVALID_SOCKET)
{
MessageBox("accept失败!");
break;
}
//这里出错!!!!!!!!!!!!!!!!!!!!!!!!!!
if(SOCKET_ERROR==WSAAsyncSelect(sAccept,m_hWnd,UM_SOCK,FD_READ|FD_CLOSE))
{
MessageBox("sAccept注册网络事件失败!");
return ;
}
//
break;
case FD_READ:
.......
在运行时会出现 :“sAccept注册网络事件失败!”
也就是在case FD_ACCPET 里面为新产生的sAccept注册FD_READ|FD_CLOSE时候,报错。为什么呢?我的本意是为每一个新生的accept套接字单独响应事件。
望高人赐教!谢谢!
FD_ACCPET 出错的这段去掉,工作就正常,也就是这段:
if(SOCKET_ERROR==WSAAsyncSelect(sAccept,m_hWnd,UM_SOCK,FD_READ|FD_CLOSE))
{
MessageBox("sAccept注册网络事件失败!");
return ;
}但是这样就没有给每个新生的accpt套接字单独注册事件,但是工作确正常。从字面上看好像只给了主套接字,也就是监听套接字m_socket注册成功了,但是工作正常。
{
OutputLog("Socket failed with error %d\n", WSAGETSELECTERROR(lParam));
}
看看是不是有什么错误发生?
困惑了,小弟等待高哥出现!