高手指点winsockets非阻塞模式设定的问题

来源:百度知道 编辑:UC知道 时间:2024/05/19 04:01:01
网络服务端部分程序代码:
SOCKET server;
sockaddr_in local;
local.sin_family=AF_INET;
local.sin_addr.s_addr=INADDR_ANY;
local.sin_port=htons((u_short)2008);
server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)
{
MessageBox(NULL,_T("Socket函数失败\r\n"),_T"sockets:"),MB_OK);
return 0;
}
if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
{
MessageBox(NULL,_T("Binding action failed\r\n"),_T("sockets:"),MB_OK);
return 0;
}
if(listen(server,10)!=0)
{
MessageBox(NULL,_T("The number of guests is over the limitation (10)\r\n"),_T("sockets:"),MB_OK);
return 0;
}
//设置为非阻塞方式
unsigned int wMsg;
HWND hwnd;
int iErrorCode;
iErrorCode = WSAAsyncSelect(server,hwnd,WM_SOCKET,FD_READ|FD_WRITE|FD_ACCEPT);
if (iErrorCode == SOCKET_ERROR)

首先你缺少了WSAStartup,所以后面的socket调用都会失败。
再一个,你提到的hWnd是响应消息WM_SOCKET的窗口句柄,在你的句柄里来处理FD_READ| FD_WRITE以及FD_ACCEPT事件。

如何初始化?
1、如果你是MFC程序,可以在你的对话框或是视图里面来处理,也就是传递他们的句柄。
2、如果是Console程序,那么先Create一个Window,传递他的句柄,在窗口过程里处理事件。

补充:
你想在哪个窗口处理消息就传哪个句柄。

再补充:

那个句柄是有用的,因为你要对socket消息进行处理,所以必须传递一个真实的窗口,而非简单的一个声明。你传递的句柄必须有自己的窗口过程,来处理WM_SOCKET消息。

你程序中已经初始化winsock了
其实非阻塞模式设定也挺简单的,只是WSAAsyncSelect中的参数设错了,hwnd应改为 AfxGetMainWnd()->m_hWnd这样一旦有FD_READ| FD_WRITE事件就会发给主窗口WM_SOCKET消息