一个奇怪CAsyncSocket的Connect阻塞问题

appleing 2008-08-29 12:33:59
我是初学MFC的.

我写了个类(暂时叫My_CAsyncSocket),继承自CAsyncSocket,并重写了OnAccept,OnConnect,OnReceive,OnSend三个函数.

然后用它(两个程序,都用My_CAsyncSocket这个类,都是new出来的,不是静态的)来互联,这是没问题的,确实没问题,发送几MB的文件,收发都正常,反正都很正常.应该说明我的代码写的是没问题的.

然后今天试了一个结构,我在两个程序互联的基础上(保持连接,没有close)..其中一个程序再new一个My_CAsyncSocket类去Connect一个网络上的地址.却发现OnConnect没有响应了.....

我觉得奇怪,怎么可能,于是把之前的两个程序互联部分去掉.程序运行后,没有和本地连接,直接去Connect这个网络地址..发现可以正常收发,下载.然后再new一个类出来连接本地程序...发现...Connect阻塞了...OnConnect没有响应了..

于是我非常郁闷,就上来问问大家,这是不是MFC中CAsyncSocket的规定,只能连接一个地址?不能同时连接多个地址?
我觉得如果别人没遇到这种情况,就肯定是我自己代码写的有问题了,希望有经验的人能说一说,只是一句话嘛.非常感谢.
...全文
289 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzultc 2008-08-29
  • 打赏
  • 举报
回复
你也可以使用多播啊!不太明白你的需求。
会不会是你的My_CAsyncSocket中的OnConnect有问题了?你是用的是多线程吧,两个对象使用的同一个处理函数时,你考虑加锁了没有啊?
cnzdgs 2008-08-29
  • 打赏
  • 举报
回复
一个对象可以连接一个地址,你用new构造的新的对象是没有问题的,应该是其它部分影响的。
zzultc 2008-08-29
  • 打赏
  • 举报
回复
学习收藏!
总感觉微软对自己的东西包了好几层纸!
这个CAsyncSocket是这样,com更是如此!
估计还有更多的东西东被隐含了一个消息循环。
appleing 2008-08-29
  • 打赏
  • 举报
回复
附上我的解决办法..既然这个线程A无法创建具有消息循环的特性的CAsyncSocket,那么,这个线程A在要new出一个CAsyncSocket的代码,就改为PoseMessage一个消息给主窗口,也就是MFCDlg窗口.由这个具有消息循环的窗口线程来创建这个CAsyncSocket,这样就可以顺利是接受消息了..
appleing 2008-08-29
  • 打赏
  • 举报
回复
而这个CAsyncSocket类必须在有UI线程(也就是该线程必须是消息循环的,不是阻塞的线程),比如MFC的那个dlg窗体线程,在这里创建的CAsyncSocket是没问题的,所以我创建了几个都没问题.

我的问题就是,当第一个CAsyncSocket接受到数据之后,我是放入一个链表(CList)中,然后用CEvent通知一个线程A来处理.这个线程A受到特定的数据包之后,将new出一个新的CAsyncSocket,然后用它去connect一个地址.然后这个线程A继续等待CEvent.

这样,这个线程A是个阻塞型的线程,不是UI线程,所以由它创建的CAsyncSocket是无法接受FD_CONNECT,FD_READ...等等任何消息的,所以我connect之后..就没用OnConnect调用了...
appleing 2008-08-29
  • 打赏
  • 举报
回复
终于找到问题的答案了,看来很多人和我一样,在线程中创建了这个socket类..

http://topic.csdn.net/t/20031030/15/2410784.html
Juchiyufei 2008-08-29
  • 打赏
  • 举报
回复
帮顶,

顺便借宝地一用,放分100,各位前辈去帮我看看哈。
http://topic.csdn.net/u/20080829/15/cf342255-bc48-450b-888c-e50f549feb69.html?seed=1460322691

欢迎去抢哈。
appleing 2008-08-29
  • 打赏
  • 举报
回复
症结我似乎找到了,我将第二个new出来的My_CAsyncSocket的过程,放在MFCDlg.cpp文件中,结果两个new都能顺利connect了.

如果我将第二个new出来的My_CAsyncSocket放在第一个new出来的My_CAsyncSocket的处理函数OnReceive中,第二个new出来的My_CAsyncSocket就无法Connect了...

这其中原因难道是MFC的CAsyncSocket自己将维护一个消息循环,如果在这个消息循环中建立另外一个消息循环,哪么这个新建立的消息循环就无法受到消息?

我打算看MFC代码了,这贴等等再结..我还很模糊,还没找到问题的关键..
appleing 2008-08-29
  • 打赏
  • 举报
回复
to cnzdgs:

既然您说没问题,那就应该是我的代码其他部分有问题了,我回去仔细查找,谢谢.

to zzults

和多播没关系,My_CAsyncSocket已经可以满足我的要求了,至于多线程是肯定的,不过也应该和同步是没关系的.因为connect是可以调用,返回0,getlasterror返回的是WSAEWOULDBLOCK..说明connect正在进行.可是我在OnConnect下的断点却一直反应....也就是说我connect之后,.CAsyncSocket无论是否成功(实际上我用sniffer可以看到连接成功,并且有数据过来,也就是说正常情况应该已经发展到OnReceive都应该出现了)都没有调用OnConnect....让我非常郁闷..

如果这样的情况还是有自锁的话,只可能出现在MFC自己的CAsyncSocket内部自锁(这也是我怀疑mfc这部分代码的原因),而我的My_CAsyncSocket又是new出来的...所以不可能有外部同用一个同步变量的情况.

18,356

社区成员

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

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