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);
}
居然没有判断对象是否已经绑定了套接字句柄?
有什么特殊的用意吗?望知情者指点一二.
...全文
456 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
源码链接: https://pan.quark.cn/s/651b74ed6067 《MQL4中文帮助手册》是一部详尽阐述MetaQuotes Language 4(MQL4)编程语言的参考书籍,其核心目标在于协助用户掌握并运用MQL4进行金融市场的自动化交易系统构建。MQL4作为MetaTrader 4交易平台的核心编程语言,赋予了交易者开发自定义指标、Expert Advisors(EA智能交易系统)以及脚本的能力。 ### MQL4基础知识 1. **Syntax 语法**:MQL4的语法规则与C/C++语言展现出相似性,涵盖了变量声明、函数调用、条件判断、循环机制等核心要素。熟练掌握并合理运用语法是开发高效MQL4代码的先决条件。 2. **Comments 注释**:在MQL4编程环境中,单行注释采用两个斜线(//)进行标识,而多行注释则通过/* 和 */进行界定。注释的主要功能在于阐释代码用途,从而提升代码的可读性与可维护性。 3. **Identifiers 标识符**:标识符是程序中用于命名变量、函数、类等元素的字符序列。其命名规则要求必须以字母或下划线作为开头,后续可包含字母、数字或下划线组合。MQL4语言对大小写敏感,因此`MyVariable`与`myvariable`被视为两个独立的标识符。 4. **Reserved words 保留字**:保留字是MQL4语言中预先设定的特殊词汇,例如`int`, `bool`, `double`, `if`, `else`, `for`, `while`等,这些词汇不可用作自定义标识符,以防止与语言关键字产生冲突。 5. **Data types 数据类型**:MQL4支持多元化的数据类型,包括...

18,356

社区成员

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

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