关于CAsyncSocket的编程

咋了啦 2008-09-26 04:55:43


我自己写了一个从CAsyncSocket继承的socket class。

mysock.Create(3767);
mysock.Listen();

mysock.AsyncSelect(FD_ACCEPT);

mfcsock.Accept(*pNewsock);

LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf, 0, NULL );
MessageBox((LPCTSTR)lpMsgBuf,_T("GetLastError"),MB_OK|MB_ICONINFORMATION );
::LocalFree( lpMsgBuf );

连接成功后,用pNewsock给client发消息,总是弹出10038错误( An operation was attempted on something that is not a socket.)


后来我看到一个帖子上说“对非阻塞CAsyncSocket而言,服务器端的socket在调用Listen之后,不能马上调用Accept,而是要在OnAccept事件发生的时候再调用Accept,返回一个新的newSocket,并且通过这个newSocket给客户端发送数据。”(http://topic.csdn.net/t/20020815/12/942852.html

我按这个上面说的修改,并注销掉mfcsock.Accept(*pNewsock)之后就马上OK,起先OnAccept没做任何事情。

问题:

1、为什么对于非阻塞的要这样做?

2、如果我不继承,直接使用CAsyncSocket,怎么个调用Accept方法?
...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
咋了啦 2008-09-26
  • 打赏
  • 举报
回复
哦,原来是这样的啊。谢谢


马上结贴给分。



不够我感觉这些MSDN上都没说清楚,特别是几个消息函数和不带On的函数的调用顺序
cnzdgs 2008-09-26
  • 打赏
  • 举报
回复
CAsyncSocket::OnAccept是空的,等着被重载。
咋了啦 2008-09-26
  • 打赏
  • 举报
回复
我知道了,刚才说错了。其实我说的不调用只不过是我把Accept放到了OnAccept中了,而在listen之后不直接调用Accept,而是等待FD_ACCEPT事件来触发OnAccept来调用Accept。


谢谢几位的回答。


问哈,MFC的源码中OnAccept是大概怎么实现的?直接用CAsyncSocket来建立连接,需要主动来调用Accept,并且用一个循环来判断Accept的返回,等待FD_ACCEPT消息触发CAsyncSocket::OnAccept的调用成功。
dirdirdir3 2008-09-26
  • 打赏
  • 举报
回复
1.这样效率高而已,你一直调用Accept也是可以的,不过这样会占用cpu时间.
scklotz 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 li_007 的回复:]
哦,你的意思是说,如果我们继续了CAsyncSocket就可以这样改写OnAccept,在OnAccept中new一个新的socket,然后可以不调用Accept函数。

如果直接用CAsyncSocket,就用一个循环来判断下,让他成功后在进行数据的发送。(因为我们没法修改MFC的代码)


可以这样理解么?
[/Quote]

有连接进来,会触发OnAccept(你要重写该函数。。。)
在该函数里调用 Accept( newClient )
之后才可以用 newClient->Send....
cnzdgs 2008-09-26
  • 打赏
  • 举报
回复
无论是否自己派生类,都要调用Accept函数。
咋了啦 2008-09-26
  • 打赏
  • 举报
回复
哦,你的意思是说,如果我们继续了CAsyncSocket就可以这样改写OnAccept,在OnAccept中new一个新的socket,然后可以不调用Accept函数。

如果直接用CAsyncSocket,就用一个循环来判断下,让他成功后在进行数据的发送。(因为我们没法修改MFC的代码)


可以这样理解么?
cnzdgs 2008-09-26
  • 打赏
  • 举报
回复
这是常规的做法。
直接调用Accept也可以,只是很可能会失败。
咋了啦 2008-09-26
  • 打赏
  • 举报
回复
对非阻塞CAsyncSocket而言,服务器端的socket在调用Listen之后,不能马上调用Accept,而是要在OnAccept事件发生的时候再调用Accept,返回一个新的newSocket,并且通过这个newSocket给客户端发送数据。


这个怎么理解?



cnzdgs 2008-09-26
  • 打赏
  • 举报
回复
如果在Accept时没有发现连接请求,会返回FALSE,你要判断返回值来处理,如果返回FALSE,可以Sleep一下再调用Accept,如此循环,直到返回成功后才能发送数据。

18,356

社区成员

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

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