我在theApp 的InitInstance()中使用了WSAAsyncSelect但是报错10022
代码如下: if(::WSAAsyncSelect(m_socket, (HWND)m_pMainWnd, WM_SOCKET, FD_ACCEPT ¦FD_CLOSE) == 0)
AfxMessageBox("ok"); 请问是什么原因,是不是必须绑定到一个dlg上?
后来改成将WSAAsyncSelect的第二个参数(HWND)m_pMainWnd改为m_pMainWnd->GetSafeHwnd()就不报错了
但是却不能响应消息处理函数
请问这是为什么?
我在头文件和.cpp文件中定义了MESSAGE_MAP的
代码如下: if(::WSAAsyncSelect(m_socket, (HWND)m_pMainWnd, WM_SOCKET, FD_ACCEPT ¦FD_CLOSE) == 0)
AfxMessageBox("ok"); 请问是什么原因,是不是必须绑定到一个dlg上?
后来改成将WSAAsyncSelect的第二个参数(HWND)m_pMainWnd改为m_pMainWnd->GetSafeHwnd()就不报错了
但是却不能响应消息处理函数
请问这是为什么?
我在头文件和.cpp文件中定义了MESSAGE_MAP的
在服务器端做使用WSAAsyncSelect
客户端可以连接的,
但服务器端不能响应
{
AfxMessageBox("onsocket");
SOCKET s = wParam;
if(WSAGETSELECTERROR(lParam)) {
AfxMessageBox("wsagetselect error");
::closesocket(s);
return 0;
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT: {
AfxMessageBox("接到客户端的连接!");
SOCKET client = ::accept(s, NULL, NULL);
WSAAsyncSelect(client, m_pMainWnd->GetSafeHwnd(), WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
}
break;
case FD_CLOSE: {
::closesocket(s);
AfxMessageBox("客户端已经断开连接!");
}
break;
case FD_READ:
{
AfxMessageBox("on read");
}
break;
}
return 0;
}
关联
BEGIN_MESSAGE_MAP(CDmApp, CWinApp)
//{{AFX_MSG_MAP(CDmApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_MESSAGE(WM_SOCKET, OnSocket)
//}}AFX_MSG_MAP
// Standard file based document commands
END_MESSAGE_MAP()
还有头文件中:
//{{AFX_MSG(CDmApp)
afx_msg long OnSocket(WPARAM wParam, LPARAM lParam);
afx_msg void OnAppAbout();
//}}AFX_MSG
应该没问题的啊
// for socket init
m_socket = INVALID_SOCKET;
if(m_socket == INVALID_SOCKET)
::closesocket(m_socket);
//创建套接字
m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(m_socket == INVALID_SOCKET) {
AfxMessageBox("sock create error");
return FALSE;
}
//填写要关联的本地地址
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.s_addr = INADDR_ANY;
//绑定端口
if(::bind(m_socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) {
AfxMessageBox("bind error");
return FALSE;
}
//设置socket为窗口通知消息类型
if(::WSAAsyncSelect(m_socket, m_pMainWnd->GetSafeHwnd(), WM_SOCKET, FD_ACCEPT|FD_CLOSE) == 0)
AfxMessageBox("WSAAsyncSelect ok"); if(::listen(m_socket, 100) == 0)
AfxMessageBox("listen ok");
WM_SOCKET 定义为WM_USER+1也应该没问题的啊,
郁闷!
是不是不能从主工程文件中使用
还是必须把它关联到一个dlg对话框中??