请教一个Socket问题!

huche 2002-12-05 07:21:50
我继承了一个CAsyncSocket类,采用非阻塞式,在Connect的时候,出错,GetLastError返回值是10035(WSAEWOULDBLOCK),我知道连接需要时间,但是无论我Sleep多长了之后还是没有触发OnConnect事件!所以在发送包的时候我无法判断是否真的已经连接上了.而在服务端是已经收到了连接请求的,请教各位!!!
...全文
34 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdf_2000 2002-12-12
  • 打赏
  • 举报
回复
把基类改为CSocket
HongHuer 2002-12-10
  • 打赏
  • 举报
回复
怎么说的这么复杂了

连接有没有出错,不是靠Connect()的返回值来判断的

应用程序运行到Connect()后,系统会自动调用OnConnect(int nErrorCode)

CMySocket::OnConnect(int nErrorCode)
{
if(nErrorCode == 0) //连接成功了
{
}
else //连接不成功
{
}

}
GirlCool 2002-12-08
  • 打赏
  • 举报
回复
关注中,我用CAsyncSocket时,遇到了同样的问题.
CAsyncSocket在作为异步非阻塞方式时,总是在客户Socket连接服务器时,收到WSAEWOULDBLOCK的错误,我查看了CSocket的源代码,发现,CSocket在实现Connet()和Accept()时,一旦收到WSAEWOULDBLOCK错误,就进入一个消息PumpMessage,然后又反复连接(接受),直到成功.

这使我不明白,CSocket为什么在收到WSAEWOULDBLOCK错误时,总进入消息循环,然后重试,直到成功.
swordman 2002-12-08
  • 打赏
  • 举报
回复
你代码的顺序写反了,connect完成以后再调用函数AsyncSelect()!这错误我同事出现过
yanhuahui 2002-12-07
  • 打赏
  • 举报
回复
你就把时间先设成永远超时,然后调试看看它的流程。
yanhuahui 2002-12-06
  • 打赏
  • 举报
回复
你那样写能保证会在Send之前为什么没有触发OnConnect事件?不一定.....

在send之前用一个等待事件

WaitForSingleObject(m_CEvent);

在OnConnnect()函数里将这个m_CEvent.SetEvent()

huche 2002-12-06
  • 打赏
  • 举报
回复
BOOL CMyClientSocket::ConnectToServer()
{
if (m_hSocket==INVALID_SOCKET)
{
if (Create()==FALSE)
{
return false;
}
}
else
{
Detach();
if (Create()==FALSE)
{
return false;
}
}
if(!AsyncSelect(FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE))
return false;
m_bConnecting = true;
if(!Connect(m_strHostAddress, m_iPort))
{
i = GetLastError(); // 此处i将是10035
if(i==10035) // 忽略这个错误继续
return true;
else
return false
}
return true ;
}

void CMyClientSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if (nErrorCode!=0)
{
m_bConnecting=false;
return;
}
m_bConnected = true;
m_bConnecting = false ;
CAsyncSocket::OnConnect(nErrorCode);
}



------------
处理文件:
.
.
.
m_pSocket=new CMyClientSocket();

if(!m_pSocket->ConnectToServer())
{
ShowMyMsg("连接服务端失败!", true);// 此处是我写的一个错误信息处理函数
// 由于前面忽略了错误,所以不会执行到此处
delete m_pSocket;
return 0;
}
  if(m_bConnected) // m_bConnected 将为false,因为没有触发OnConnect事件.
Send(.....);
                      // 如果不判断m_bConnected直接Send,服务端能收到请求包
.
.
.
我现在的问题是在Send之前为什么没有触发OnConnect事件,那样我怎么判断是否已经连接上?因为如果服务端没有启动,Connect也是那个错误啊.
wanglei888 2002-12-06
  • 打赏
  • 举报
回复
还是贴程序看看吧。。。
huche 2002-12-06
  • 打赏
  • 举报
回复
服务器端是没有问题的,是别人已经在用着的产品.
即使服务端没有启动调用Connect后再调用GetLastError返回的错误代码也是10035,所以我不知该怎么判断是否已经连接上了.难道不判断就直接Send吗?

if(!AsyncSelect(FD_CONNECT | FD_CLOSE | FD_READ | FD_WRITE))
return false;
if(!Connect(StrHostAddress, iPort))
{
i = GetLastError(); //此处i将是10035
....
}
wanglei888 2002-12-06
  • 打赏
  • 举报
回复
服务器端在OnAccept中调用Accept了没有?
huche 2002-12-06
  • 打赏
  • 举报
回复
你们有可能没有理解我的意思或者我没有讲清楚.
一开始我是没有使用Sleep的,但是在Send的时候出错了,跟踪发现是没有触发 OnConnect事件,并发现Connect的时候调用GetLastError返回的错误代码是10035,这个错误代码是表示连接需要时间,所以我等它连接完成啊,所以我用了Sleep.但还是触发不了OnConnect事件,由于触发不了这个事件就修改不了状态标志,我是在OnConnect事件中修改各个状态标志的,所以...
但令我纳闷的是服务端每次都是收到了连接请求的,所以Connect之前的代码是应该没有问题的.
HongHuer 2002-12-06
  • 打赏
  • 举报
回复
把断点设在connect OnConnect 中看看结果
huche 2002-12-06
  • 打赏
  • 举报
回复
To anyiflyer(西门吹雪)
AsyncSelect是设置为异步非阻塞式,服务器端就是异步非阻塞式.
huche 2002-12-06
  • 打赏
  • 举报
回复
To yanhuahui(眼发黑)
我照着你说的做了,我即使把超时时间设置到十几秒都照样超时!
门吹西风 2002-12-06
  • 打赏
  • 举报
回复
CAsyncSocket缺省是阻塞方式的,CAsyncSocket::GetLastError()返回10035,表示该socket不是阻塞方式工作,而是异步方式工作,原因是你调用了CAsyncSocket::AsyncSelect(),该调用会把socket置为异步方式,所以会出现你说的错误.由于服务器是别人写好的,你不能改它,只有改你自己的了.
wanglei888 2002-12-05
  • 打赏
  • 举报
回复
不能sleep的,connect后,就别管了

在OnConnect中进行下一步处理
athere_08 2002-12-05
  • 打赏
  • 举报
回复
你不睡眠不行吗?为什么要睡眠呢!
Bind 2002-12-05
  • 打赏
  • 举报
回复
应该是这样的:

CMySocket m_sock;

m_sock.Create();
m_sock.Connect(m_strServerIP, m_uiServerPort);
到这里连接的调用就结束了。接下来就会触发CMySocket::OnConnect的消息了。

18,356

社区成员

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

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