社区
网络编程
帖子详情
请教一个Socket问题!
huche
2002-12-05 07:21:50
我继承了一个CAsyncSocket类,采用非阻塞式,在Connect的时候,出错,GetLastError返回值是10035(WSAEWOULDBLOCK),我知道连接需要时间,但是无论我Sleep多长了之后还是没有触发OnConnect事件!所以在发送包的时候我无法判断是否真的已经连接上了.而在服务端是已经收到了连接请求的,请教各位!!!
...全文
83
18
打赏
收藏
请教一个Socket问题!
我继承了一个CAsyncSocket类,采用非阻塞式,在Connect的时候,出错,GetLastError返回值是10035(WSAEWOULDBLOCK),我知道连接需要时间,但是无论我Sleep多长了之后还是没有触发OnConnect事件!所以在发送包的时候我无法判断是否真的已经连接上了.而在服务端是已经收到了连接请求的,请教各位!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的消息了。
linux
socket
sin_addr.s_addr,
请教
:
一个
linux下
socket
编程的
问题
!
在Linux下进行
socket
编程时,遇到
一个
问题
:服务器无法正确获取客户端的IP地址和端口号,导致客户端无法收到回复。
问题
出现在server.c和client.c中,可能的原因是sendto和recvfrom函数使用不当。同时,代码中存在冗余的地址记录。建议查阅UNIX网络编程相关资料以解决此
问题
。
c++
socket
发送文字少
一个
字符_
Socket
粘包
问题
的3种解决方案,最后一种最完美!...
本文聚焦Java中TCP协议使用时的粘包和半包
问题
。介绍了TCP协议特点,阐述粘包是一次性读取多条数据、半包是读取部分数据的情况及成因。通过代码演示
问题
,给出三种解决方案,包括固定缓冲区大小、封装请求协议、特殊字符结尾按行读取,推荐最后一种。
关于
socket
网络的
一个
小
问题
本文介绍了
一个
简单的
Socket
网络编程模板代码,演示了如何使用Winsock库创建客户端并连接到指定的服务器IP地址及端口。
Socket
编程,C语言版!
本文详细介绍了C语言中
Socket
编程的send和recv函数,包括它们的功能、参数解析及执行流程。send函数用于向TCP连接的另一端发送数据,recv函数则用于接收数据。在同步
Socket
中,send会等待协议发送数据,而recv会等待数据接收完成。文章还提醒了send和recv在处理错误及网络中断情况下的返回值。快来加入编程学习基地,一起提升编程技能吧!
如何优雅地关闭
一个
socket
本文详细介绍了在Windows编程中如何优雅地关闭
一个
Socket
连接,包括主动关闭和被动关闭的区别,
Socket
的状态变化过程,以及使用Winsock2 API中的close
socket
、shutdown等函数的方法。
网络编程
18,357
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章