CAsyncSocket实现的不解

YufengShi 2006-04-28 03:22:44
void test5()
{
AfxSocketInit();
CAsyncSocket sock;
SOCKET s1 = socket(AF_INET, SOCK_STREAM, 0);
SOCKET s2 = socket(AF_INET, SOCK_STREAM, 0);
sock.Attach(s1);
sock.Attach(s2);
CAsyncSocket* pS1 = CAsyncSocket::FromHandle(s1);
CAsyncSocket* pS2 = CAsyncSocket::FromHandle(s2);
ASSERT(pS1==pS2);
ASSERT(pS1->m_hSocket != s1); //不一致
}
如上代码,同一CAyncSocket对象怎么可以两次成功Attach,而且查询全局线程局部存储得到的
套接字句柄对应的CAyncSocket是同一对象,但是显然pS1与s1不再绑定了.
这是CAyncSocket::Attach的源代码
BOOL CAsyncSocket::Attach(SOCKET hSocket, long lEvent) //一个对象可以attach多次?
{
ASSERT(hSocket != INVALID_SOCKET);

m_hSocket = hSocket;
CAsyncSocket::AttachHandle(hSocket, this);

return AsyncSelect(lEvent);
}
居然没有判断对象是否已经绑定了套接字句柄?
有什么特殊的用意吗?望知情者指点一二.
...全文
313 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdxheb 2006-08-18
  • 打赏
  • 举报
回复
来晚啦
yisong_net 2006-04-30
  • 打赏
  • 举报
回复
http://blog.csdn.net/lspo816/archive/2006/04/14/663554.aspx
YufengShi 2006-04-30
  • 打赏
  • 举报
回复
up
YufengShi 2006-04-30
  • 打赏
  • 举报
回复
如果本贴没答案,就当散分贴了
祝兄弟们五一节快乐!有空多出去走走,不要老呆在电脑前。
soaroc 2006-04-30
  • 打赏
  • 举报
回复
up一下,正在学习网络编程
YufengShi 2006-04-29
  • 打赏
  • 举报
回复
期待高论..
sevencat 2006-04-29
  • 打赏
  • 举报
回复
这些问题还是想办法去绕过他,你再怎么说也没啥用。
guosenjuncs 2006-04-28
  • 打赏
  • 举报
回复
CAsyncSocket sock;
CAsyncSocket sock1;
SOCKET s1 = socket(AF_INET, SOCK_STREAM, 0);
SOCKET s2 = socket(AF_INET, SOCK_STREAM, 0);
BOOL bRt = sock.Attach(s1);
BOOL bRt2 = sock1.Attach(s2);
CAsyncSocket* pS1 = CAsyncSocket::FromHandle(s1);
CAsyncSocket* pS2 = CAsyncSocket::FromHandle(s2);
这样就可以了
guosenjuncs 2006-04-28
  • 打赏
  • 举报
回复
每次在Attach前Detach
guosenjuncs 2006-04-28
  • 打赏
  • 举报
回复
SOCKET s1 = socket(AF_INET, SOCK_STREAM, 0); // s1 = 1868
SOCKET s2 = socket(AF_INET, SOCK_STREAM, 0); // s2 = 1852
BOOL bRt = sock.Attach(s1); // = 1
BOOL bRt2 = sock.Attach(s2); // = 1
CAsyncSocket* pS1 = CAsyncSocket::FromHandle(s1); // pS1->m_hSocket = 1852
CAsyncSocket* pS2 = CAsyncSocket::FromHandle(s2); // pS2->m_hSocket = 1852
ASSERT(pS1==pS2);
ASSERT(pS1->m_hSocket != s1); //不一致

以上的注释是调试的结果,可以看出一些信息:
CAsyncSocket只能Attach 一个SOCKET,前面的attach被后面的attach代替了,也就是只能绑定一个SOCKET;
出现pS1->m_hSocket == pS2->m_hSocket的原因在于CAsyncSocket::FromHandle这个函数,
当CAsyncSocket::FromHandle(SOCKET hSocket)调用时,如果hSocket没有被Attach 到某个CAsyncSocket对象时,这个函数就返回NULL
YufengShi 2006-04-28
  • 打赏
  • 举报
回复
我确实知道,不过我不能保证不会两次Attach
sevencat 2006-04-28
  • 打赏
  • 举报
回复
他假设你还知道另一个Detach函数吧。
YufengShi 2006-04-28
  • 打赏
  • 举报
回复
多谢,up有分
echohere 2006-04-28
  • 打赏
  • 举报
回复
关注
up
YufengShi 2006-04-28
  • 打赏
  • 举报
回复
说明一下,本人用的VC6.0

18,355

社区成员

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

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