关于异步事件WSAAsyncSelect的问题

hanzp 2003-03-25 10:45:12
我创建一个监听线程,在线程内等待客户端请求。我用WSAAsyncSelect(),但它是异步的,并不会堵塞运行。我该如何编写呢?
我的代码是这样的:
void CreateListenThread(void* pDlg)
{
SOCKET* myListenSocket;
sockaddr_in sockaddr;
int nResult;
int nSockErr;
int nPort;
HWND hWnd;

nPort = ((CServerDlg*)pDlg)->m_nPort;
hWnd = ((CServerDlg*)pDlg)->GetSafeHwnd();

sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(nPort);


myListenSocket = new SOCKET(AF_INET, SOCK_STREAM, 0);
nResult = bind(*myListenSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr));

if ( nResult == SOCKET_ERROR )
{
nSockErr = WSAGetLastError();
//.........
}

nResult = listen(*myListenSocket, 5);
if ( nResult == SOCKET_ERROR )
{
nSockErr = WSAGetLastError();
//.....
}




while ( WSAAsyncSelect(*myListenSocket, hWnd, WM_USER+1, FD_ACCEPT) == 0 )
{

AfxMessageBox("a request received");
//.....

}
}
可我运行起来不是很好,请高手指教
...全文
26 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
蟑螂工作室 2003-06-21
  • 打赏
  • 举报
回复
gz
hanzp 2003-03-25
  • 打赏
  • 举报
回复
->地球发动机:又是你帮我回答问题,万分感谢!
我现在的问题是:
是不是 WSAAsyncSelect(*myListenSocket, hWnd, WM_USER+1, FD_ACCEPT)已经实现注册了SOCKET消息了啊?如果是的话,那我是要在线程里处理这个消息,是不是要用Event对象啊?
另外我现在调试的时候发现,我的
nResult = bind(*myListenSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr))
有问题,我用
nSockErr = WSAGetLastError()
得到是WSAENOTSOCK出错,可我查看了发现 myListenSocket!=NULL,这又是怎么回事呢?
kaitty 2003-03-25
  • 打赏
  • 举报
回复
我用WSAAsyncSelect(),但它是异步的,并不会堵塞运行。

那为什么要使用线程,直接接收窗口消息就可以了啊
JoeRen 2003-03-25
  • 打赏
  • 举报
回复
WSAAsyncSelect可不是这样用的啊。
你只需要调用一次,向窗口注册SOCKET消息,然后你就需要加入WM_USER+1消息的处理函数,在那个地方根据所发生的套接子事件调用相应的处理。例如,如果收到了FD_ACCEPT,就应该调用accept函数接受请求,并获得一个已连接的套接字。
hanzp 2003-03-25
  • 打赏
  • 举报
回复
我刚才调试的时候已经发现我的myListenSocket = new SOCKET(AF_INET, SOCK_STREAM, 0)不对了,我已经改了过来了。多谢你后面的指点
JoeRen 2003-03-25
  • 打赏
  • 举报
回复
啊,你那句myListenSocket = new SOCKET(AF_INET, SOCK_STREAM, 0);
我是看不明白了。SOCKET只不过是一个宏定义,代表一个无符号整数而已,何来的构造函数呢?这句其实不起任何作用,只不过是返回了一个new出来的无符号整数,后面的参数是一概忽略了的。
所以这样写是不对的。
你应该把myListenSocket定义成SOCKET型而不是SOCKET*型。然后这样来用:
myListenSocket=socket(AF_INET,SOCK_STREAM,0);

你说的是对的,WSAAsyncSelect的作用就是注册SOCKET消息。注册了之后,当收到消息时msg.wParam参数表是有事件发生的那个套接字,可以强制转换成SOCKET型。而msg.lParam的高位字表示套接字上发生的错误,低位字表示所发生的事件(FD_ACCEPT、FD_CONNECT、FD_READ、FD_WRITE、FD_OOB、FD_CLOSE)。
至于要在线程里面处理消息,有很多种方法。Event对象只是其中一种。
hanzp 2003-03-25
  • 打赏
  • 举报
回复
那个 WSAAsyncSelect(*myListenSocket, hWnd, WM_USER+1, FD_ACCEPT) 是不是有点回调函数的感觉?就是说当我这个myListenSocket收到 FD_ACCEPT消息时,自动调用我在主窗体定义的接收WM_USER+1消息的函数

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧