为何客户端在connect失败后竟然会触发FD_CONNECT消息!!!

zhiweiyouzhishenghuo 2011-08-19 11:09:08
USES_CONVERSION;
SOCKADDR_IN addrSockvoip;
addrSockvoip.sin_addr.S_un.S_addr=inet_addr(T2A(m_ip));
addrSockvoip.sin_family=AF_INET;
addrSockvoip.sin_port=htons(m_port);
WSAAsyncSelect(m_voip,m_hWnd,UM_SOCK,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE);
WSAConnect(m_voip,(SOCKADDR*)&addrSockvoip,sizeof(SOCKADDR),NULL,NULL,NULL,NULL);
Sleep( 1000);
// CreateThread(NULL,0,Heart,this,0,NULL);




----------
LRESULT CSIPDlg::OnSock(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_CONNECT:
{
if(FALSE==voidflag)
{
if(TRUE==manageflag)
{
ServerSendMessage(m_client,MSG_VOIPOK,0,0,0,0,"",111);
ServerSendMessage(m_client,99999,99999,9999,0,0,"fad",12);//发送voip运行信息
voidflag=TRUE;
...全文
797 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexandrov 2014-03-28
  • 打赏
  • 举报
回复
After connect, WSAConnect, or WSAJoinLeaf was called with a nonblocking, connection-oriented socket. The initial operation returned with a specific error of WSAEWOULDBLOCK, but the network operation went ahead. Whether the operation eventually succeeds or not, when the outcome has been determined, FD_CONNECT happens. The client should check the error code to determine whether the outcome was successful or failed.
alexandrov 2014-03-28
  • 打赏
  • 举报
回复
LZ,我也刚学到这里,你的问题msdn上有解释的:
  • 打赏
  • 举报
回复
连接不成功也会触发FD_CONNECT消息?
USES_CONVERSION;
SOCKADDR_IN addrSockvoip;
addrSockvoip.sin_addr.S_un.S_addr=inet_addr(T2A(m_ip));
addrSockvoip.sin_family=AF_INET;
addrSockvoip.sin_port=htons(m_port);
WSAAsyncSelect(m_voip,m_hWnd,UM_SOCK,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE);
while(1)
{
int nError = WSAConnect(m_voip,(SOCKADDR*)&addrSockvoip,sizeof(SOCKADDR),NULL,NULL,NULL,NULL);
if((nError ==INVALID_SOCKET) && (WSAGetLastError() != WSAEWOULDBLOCK))
{
TRACE("connect failed !");
return;
}
TRACE("%d",GetLastError());
Sleep( 1000);
}
----------------------------
$err,hr 0x00002735 在一个非阻挡套接字上尝试了一个已经在进行的操作。 unsigned long
TRACE 出10035

第2次运行到这里的时候
$err,hr 0x00002735 在一个非阻挡套接字上尝试了一个已经在进行的操作。 unsigned long
TRACE出connect failed !


然后就进入了消息响应函数,而且单步调试表示他进入了FD_CONNECT
  • 打赏
  • 举报
回复
为何会失败?
我TRACE 了返回为-1
我服务器都没开……怎么可能会成功?
汪宁宇 2011-08-19
  • 打赏
  • 举报
回复
非阻塞的connect或WSAConnect判断返回值应该这样写吧:

int nError = connect/WSAConnect(...);
if((nError == SOCKET_ERROR) && (WSAGetLastError() != WSAEWOULDBLOCK))
{
TRACERT("connect failed !");
return;
}
汪宁宇 2011-08-19
  • 打赏
  • 举报
回复
你怎么知道失败?
LENOVO_ 2011-08-19
  • 打赏
  • 举报
回复
没看到你 检查 WSAConnect 的返回值。 用 WSAGetLastErr看看什么 原因
  • 打赏
  • 举报
回复
结贴了。
我半天的结果是,并非是完成连接才发送FD_CONNECT,如果是真正连接也会产生FD_CONNECT。
我们可以在FD_CONNECT中在去判断是否连接成功!!!
对于论坛上的解释……
只能感觉论坛的影响力和对新手的指导已经逐渐减弱了……哎

18,357

社区成员

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

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