社区
通信技术
帖子详情
两个在WSAAsyncSelect异步操作中的问题
naile
2001-10-31 10:39:35
我有两个在WSAAsyncSelect异步操作中的问题一直不太明白:
1、怎样使回调函数响应FD_WRITE事件,即我要向网络的另一端发送信息,怎样使回调函数接收到FD_WRITE事件?
2、如果我接受的信息不是固定类型的,如有时我要接受数值型的信息,有时是字符型的,且不同类型的信息对应不同的操作,该如何处理?
...全文
220
5
打赏
收藏
两个在WSAAsyncSelect异步操作中的问题
我有两个在WSAAsyncSelect异步操作中的问题一直不太明白: 1、怎样使回调函数响应FD_WRITE事件,即我要向网络的另一端发送信息,怎样使回调函数接收到FD_WRITE事件? 2、如果我接受的信息不是固定类型的,如有时我要接受数值型的信息,有时是字符型的,且不同类型的信息对应不同的操作,该如何处理?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
caiyi9000
2001-11-01
打赏
举报
回复
to naile():
我没误会你的意思,你大概还没完全看懂我介绍的方法和异步非阻塞Winsock的工作机制。
你在void CXXXDlg::a()中,用send(m_socket, ...)发送网络数据时,在你定义的m_socket上就会发生FD_WRITE事件,你的应用程序自动就会走到OnSend()中,不信你试试。
同样你在客户端用connect(m_socket, ...)向服务器发出连接请求时,在m_socket上也会发生FD_CONNECT事件。在得到服务器回应后(或超时),你的客户端程序会自动走到OnConnect(int errcode)中,errcode是传进来的错误代码,你在OnConnect(int errcode)中判断errcode,若为0,则连接服务器成功!若不成功,传进来的errcode将是非0的数,你可以通过errcode得到连接不成功的具体原因。
naile
2001-11-01
打赏
举报
回复
up
caiyi9000
2001-10-31
打赏
举报
回复
1.你用WSAAsyncSelect(Sock, hWnd, WM_NETMESSAGE, FD_CONNECT ¦ FD_CLOSE ¦ FD_READ ¦ FD_WRITE) 把Sock设置异步模式时,hwnd就是你的主窗口句柄,你的网络异步事件都投递到此窗口。而WM_NETMESSAGE就是需要你自己定义的网络异步事件。
#define WM_NETMESSAGE WM_USER+166
然后你自己增加消息映射
ON_MESSAGE(WM_NETMESSAGE,OnNetMessage)
其中OnNetMessage()就是网络异步事件的回调函数,由你自己定义,在里面可以读出各种网络异步事件,并进行相应处理。一般定义如下:
void OnNetMessage(WPARAM wParam, LPARAM lParam)
{
//得到发生此网络异步事件的套接字
SOCKET CurSock = (SOCKET)wParam;
//得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
switch(iEvent)
{
case FD_ACCEPT: //客户端连接请求
{
//做接受连接工作
OnAccept(CurSock);
break;
}
case FD_CLOSE: //客户端断开事件:
{
OnClose(CurSock);
break;
}
case FD_READ: //网络数据包到达事件
{
OnReceive(CurSock);
break;
}
case FD_WRITE: //发送网络数据事件
{
OnSend(CurSock);
break;
}
default: break;
}
}
你可以参考我在开发文档中发表的文章《Winsock开发网络通信程序的经典入门》
2.SOCKET传输的都是字符型(BYTE)数据,读到后,你自己程序里做相应转换,并做相应处理。
hellion
2001-10-31
打赏
举报
回复
1、如:WSAAsyncSelect(Sock, hWnd, WM_MYMSG, FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE)
2、接收到的数据自己分析,本身无所谓什么类型
naile
2001-10-31
打赏
举报
回复
to:caiyi9000(只懂Winsock)
第二个问题已懂,但是第一个问题可能你弄错了我的意思,我所说的是比如说我的程序中有一个按钮,单击此按钮响应函数---void CXXXDlg::a(),我想在单击此按钮后程序发出一个信息,程序的回调函数就用你在《Winsock开发网络通信程序的经典入门》中的例子,CXXXDlg::a()函数该如何编写?
windows 下 W
SAAs
ync
Select
模型
W
SAAs
ync
Selec是Winsock提供的一个适合于Windows编程使用的函数,它允许在一个套接口上当发生特定的网络事件时,给Windows网络应用程序(窗口或对话框)发送一个消息(事件通知)。 W
SAAs
ync
Select
模型与
select
模型的相同点是它们都可以对多个套接字进行管理。但它们也有不小的区别。首先W
SAAs
ync
Select
模型是
异步
的,且通知方式不同
关于winsock
中
异步
通信的一个怪
问题
的解决。
昨天练习了一天
异步
式网络通讯编程,在一个使用W
SAAs
ync
Select
模式的程序
中
出现了
问题
,
问题
出现的很蹊跷,客户端可以和服务端连上,但就是触发不了服务器的自定义事件,但是如果手动用SendMessage去触发事件的话,一切正常,最初怀疑是代码
问题
,检查了好多遍,换了很多种方法,都没用,最后网上查了好多资料,代码改了又改,还是有
问题
,最后监视网络、抓包、查内存,反汇编。。。全用上了,但就是解决
API SOCKET基础(五)
异步
套接字
前面介绍的socket
操作
中
,有一个非常大的缺陷,当一个socket运行accept,recv,recvfrom等网络
操作
的时候,程序就要等待函数成功返回一个值后才能继续往下执行。譬如说,一个tcp socket用recv函数接收数据,那么程序的执行就停留在recv语句上一直等待数据的到来,这就是所谓的同步套接字。有米办法让程序不会卡在accept,recv,recvfrom这样的网络
操作
上呢?简
c++Socket
异步
通讯
在网络通讯
中
,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回,这种现象叫做阻塞。 Winsock对有可能阻塞的函数提供了两种处理方式:阻塞和非阻塞方式。 阻塞模式 在阻塞方式下,收发数据的函数在被调用后一直要到传送完毕或者出错才能返回。在阻塞期间,被阻的函数不会断调用系统函数GetMessage()来保持消...
Windows Socket五种I/O模型
Windows Socket五种I/O模型 Winsock 的I/O
操作
: 1、 两种I/O模式 阻塞模式:执行I/O
操作
完成前会一直进行等待,不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。 非阻塞模式:执行I/O
操作
时,Winsock函数会返回并交出控制权。这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDB
通信技术
4,397
社区成员
28,909
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章