MFC的CAsyncSocket类如何同时实现TCP和UDP传输?

rwxdfbb 2010-12-16 07:21:45
程序中要同时用到TCP和UDP来通信,自己写个类来继承CAsyncSocket类,那是不是不管TCP还是UDP来数据都会调用事件响应函数OnReceive(),我怎么判断是TCP还是UDP数据,要在OnReceive()函数里面分别调用receive和receivefrom来看哪个buffer收到数据吗?有没有更好的办法?又或者如果我再自定义一个类,也派生于CAsyncSocket类,如果这个类的onreceive()也被重写,那么来TCP和UDP数据会调用哪个类onreceive()呢?请高手指点一二...
...全文
417 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-12-18
  • 打赏
  • 举报
回复
你创建2个socket不就可以了
fantiyu 2010-12-18
  • 打赏
  • 举报
回复
对于同一个socket是无法同时进行tcp和udp传递的
除非使用raw socket自己实现tcp和udp层传输
ltzhencn 2010-12-17
  • 打赏
  • 举报
回复
说错了,是调用m_Socket.Send()。。。。
ltzhencn 2010-12-17
  • 打赏
  • 举报
回复
CAsyncSocket是非阻塞的...
当调用m_Socket.Recv()函数发送网络缓冲区中的数据时,均会执行到OnSend()函数,你可以在此函数中做一些发送网络数据时的处理工作。如这位兄弟说的:
[Quote=引用 11 楼 hurryboylqs 的回复:]
在异步的套接字里OnSend是系统通知你可以继续发送数据了
该函数并不常被调用,一般是在Connect完成后被调用用一次
或者Send函数发送太频繁,导致发送缓冲区满了,当网络繁忙状态缓解
OnSend方法会被调用
[/Quote]
rwxdfbb 2010-12-17
  • 打赏
  • 举报
回复
恩,是我自己搞糊涂了,多谢各位
另外还有一点不明白:CAsyncSocket类的Onsend()函数是如何被触发的,onreceive还可以理解,有数据到就会触发,但是send的时候,我是主动的,既然都已经send了,还要Onsend来做什么,反过来,Onsend被触发的时候,说明已经send了,这不是逻辑上的矛盾了吗,Onsend究竟是如何被触发的?请高手指点迷津
rwxdfbb 2010-12-17
  • 打赏
  • 举报
回复
关于OnSend还是不太明白啊,举个简单例子,比如我作为服务端,当有客户端给我发数据的时候,我根据客户端发来的命令格式来确认发送不同的命令格式来回复对方,例如我在OnReceive函数里可能收到对方发来"AA:123";也可能是"BB:123",我判断发过来的是"AA:123"就返回"AA:456",是"BB:123"就返回"BB:456",关键就是这个返回的数据怎么处理,我知道可以在OnReceive里直接调用send来回复对方,但是这样据说send就变为阻塞了,而且结构也不太好,也没用到OnSend,如果想用在OnSend里回复客户端,该怎么处理?在OnReceive里收到数据后又是如何触发这个OnSend呢?
hurryboylqs 2010-12-17
  • 打赏
  • 举报
回复
在异步的套接字里OnSend是系统通知你可以继续发送数据了
该函数并不常被调用,一般是在Connect完成后被调用用一次
或者Send函数发送太频繁,导致发送缓冲区满了,当网络繁忙状态缓解
OnSend方法会被调用,这种情况本我没遇到过,因为我的网速太好了
基本发送就出去了,哈哈
xiaoguailong3 2010-12-17
  • 打赏
  • 举报
回复
OnSend()是你已经在代码里send了,但是有没有发是OnSend()函数帮你搞定
xiaoguailong3 2010-12-17
  • 打赏
  • 举报
回复
用2个Socket连接,可以判断是哪个Socket的数据,就可以知道是哪的数据
ltzhencn 2010-12-17
  • 打赏
  • 举报
回复
msdn说明:

OnSend
Notifies a socket that it can send data by calling Send.
通知一个socket,可以使用Send函数进行数据的发送了。

CAsyncSocket
Class CAsyncSocket encapsulates the Windows Socket Functions API, providing an object-oriented abstraction for programmers who want to use Windows Sockets in conjunction with MFC.
CAsyncSocket 实现了Windows Socket Functions API,实际上也是对原始socket的另一种实现。
CAsyncSocket 也是通过阻塞的套接字来实现异步功能的,只不过是自己处理了发生的阻塞。


所以,OnSend()是通知可以进行Send的一个消息处理函数。
ltzhencn 2010-12-16
  • 打赏
  • 举报
回复
如果俩都要实现的话,你得创建2个socket吧,毕竟没见过1个socket可以tcp、udp一块使用的..
rwxdfbb 2010-12-16
  • 打赏
  • 举报
回复
想我这样既要实现TCP又要实现UDP,有没有好的模板格式呢?
ltzhencn 2010-12-16
  • 打赏
  • 举报
回复
CMyAsyncSocket mysocket = socket(AF_INET,sock_stream,..);
当你创建对象初始化的时候,已经确定了吧
ltzhencn 2010-12-16
  • 打赏
  • 举报
回复
当你创建socket的时候就已经决定了用的是tcp还是udp吧,怎么可能会出现你所的情况呢?
也可能我没弄明白你的意思吧...
rwxdfbb 2010-12-16
  • 打赏
  • 举报
回复
CAsyncSocket类应该可以构建TCP和UDP两种类型的对象吧(用create)!就是不知道onreceive响应的是是TCP还是UDP数据?
羽飞 2010-12-16
  • 打赏
  • 举报
回复
我不明白一个套接字怎么既支持TCP协议又支持UDP协议,除非用Raw

18,356

社区成员

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

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