简单的MFC的echo程序,已经成功了,但为什么连接时还是报WSAEWOULDBLOCK?

执假以为真 2006-05-27 02:57:43
在写一个最简单的Echo程序,已经可以成功运行了。使用的是WinSocket1.1,建立TCP连接,客户端和服务器端的程序写在一个类里(即基于对话框的那个类)。客户端是非阻塞接收服务器端消息。在客户端建立连接时,代码如下:
void CEchoDlg::OnConnect()
{
int noSuc;
int errorType;
WSADATA wsaData;
noSuc=WSAStartup((WORD)((1<<8)|1),(LPWSADATA) &wsaData); //返回值为0,说明成功
if(noSuc) //不为0,则说明startup失败
AfxMessageBox("Error of startup");

//SOCKET
my_sd=socket(AF_INET,SOCK_STREAM,0);
int wsaasyn=WSAAsyncSelect(my_sd,m_hWnd,CLI_MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT);
if(wsaasyn!=0)
AfxMessageBox("Error in CLient WSAAsyncSelect");


/*以下一段是对CIPAddressCtrl控件的使用*/
BYTE f0,f1,f2,f3;
m_serverIP.GetAddress(f0,f1,f2,f3);
CString IP;
IP.Format("%d.%d.%d.%d",f0,f1,f2,f3);
//AfxMessageBox(IP);

struct sockaddr_in sa; //变量宣告
sa.sin_family = AF_INET; //设定所要连接的 Server 端数据
sa.sin_port = htons(UINT(4000));
sa.sin_addr.s_addr =inet_addr(IP.GetBuffer(0)); //该地址是127.0.0.1

int noConn=connect(my_sd, (struct sockaddr far *)&sa, sizeof(sa)); //建立连接
if(noConn)
{
errorType=WSAGetLastError();
//AfxMessageBox("Connect Failed!");
switch(errorType)
{
case WSANOTINITIALISED:
AfxMessageBox("WSANOTINITIALISED");
break;
case WSAENETDOWN:
AfxMessageBox("WSAENETDOWN");
break;
case WSAEADDRINUSE:
AfxMessageBox("WSAEADDRINUSE");
break;
case WSAEINTR:
AfxMessageBox("WSAEINTR");
break;
case WSAEINPROGRESS:
AfxMessageBox("WSAEINPROGRESS");
break;
case WSAEALREADY:
AfxMessageBox("WSAEALREADY");
break;
case WSAEADDRNOTAVAIL:
AfxMessageBox("WSAEADDRNOTAVAIL");
break;
case WSAEAFNOSUPPORT:
AfxMessageBox("WSAEAFNOSUPPORT");
break;
case WSAECONNREFUSED:
AfxMessageBox("WSAECONNREFUSED");
break;
case WSAEFAULT:
AfxMessageBox("WSAEFAULT");
break;
case WSAEINVAL:
AfxMessageBox("WSAEINVAL");
break;
case WSAEISCONN:
AfxMessageBox("WSAEISCONN");
break;
case WSAENETUNREACH:
AfxMessageBox("WSAENETUNREACH");
break;
case WSAENOBUFS:
AfxMessageBox("WSAENOBUFS");
break;
case WSAENOTSOCK:
AfxMessageBox("WSAENOTSOCK");
break;
case WSAETIMEDOUT:
AfxMessageBox("WSAETIMEDOUT");
break;
//下面这句,无论服务器端起来没有,点击建立连接后都会报出来。
case WSAEWOULDBLOCK:
AfxMessageBox("WSAEWOULDBLOCK ");
break;
case WSAEACCES:
AfxMessageBox("WSAEACCES");
break;
}
}
}


在errorType的错误类型中,有一项就是WSAEWOULDBLOCK,但是即使我的程序客户端和服务器端可以通讯的情况下(Echo的来往过程都无误),建立连接的当时,noConn的值仍然不为0,仍会变成WSAEWOULDBLOCK。如果我不启动服务器,直接使用客户端,点“连接服务器”,调用这个函数,也会报这个错。请问这是怎么回事呢?为什么连接成功,可以通讯的情况下,在连接的当时,也会报WSAEWOULDBLOCK的错误呢?

需要源代码帮我解决问题的,可以发邮件给我 zqleilei@163.com
不胜感激!
...全文
352 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
执假以为真 2006-05-30
  • 打赏
  • 举报
回复
今天看了下http://topic.csdn.net/t/20041126/17/3592054.html这个帖子,在倒数第二个回帖中不经意间发现了解决的方法。很简单,把WSAAsynSelect函数放到connect函数之后就可以分辨到底是服务器端没有开启服务而导致了错误,还是因为该同步函数。
执假以为真 2006-05-29
  • 打赏
  • 举报
回复
谢谢超级大猩猩,今天程序不在身边试不了,明天试一下.不知道你这CSDN全文搜索是什么意思呀?是自己做了个搜索工具,还是你是CSDN官方的大哥呢?
Kudeet 2006-05-28
  • 打赏
  • 举报
回复
参考下面的帖子实现WSAAsyncSelect连接超时的类似功能
http://topic.csdn.net/t/20041126/17/3592054.html
Kudeet 2006-05-28
  • 打赏
  • 举报
回复
connection的时候如果得到这个WSAEWIULDBLOCK错误, ,你需要建立等待时间, 如果在这个时间内一直得到WSAEWIULDBLOCK错误, 那就可以认为连接不上了. 可以用简单的循环不停的连接
执假以为真 2006-05-27
  • 打赏
  • 举报
回复
我现在想做到的是:如果服务器端没有起来,那么我点击connect以后可以知道没有连接上。现在因为都报同一个错,所以无法区分了。
执假以为真 2006-05-27
  • 打赏
  • 举报
回复
那么我应该如何区分connect成功还是没成功呢?因为如果服务器端没有起来的话,我直接点客户端的“连接服务器”,也是报这个WSAEWIULDBLOCK。
nuaawenlin 2006-05-27
  • 打赏
  • 举报
回复
你的socket是非阻塞的,connect是会返回这个错误的,表明操作没有完成,但这个不表明

网络通讯有问题,只是说底层已经接收了指令,但是连接的动作没有完成
执假以为真 2006-05-27
  • 打赏
  • 举报
回复
不好意思,我这里提出的问题已经超出了CSDN论坛全文搜索所能搜到的内容。

因为这里是connect函数返回的错误,而不是send
Kudeet 2006-05-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20050328/11/3887277.html
http://topic.csdn.net/t/20050405/12/3910107.html
Kudeet 2006-05-27
  • 打赏
  • 举报
回复
非阻塞模型一定要自己处理WSAEWOULDBLOCK的情况, 不能和其他的错误等同对待.因为,当Socket发送缓冲区满,或者暂时无法发送时,send函数将返回WSAEWOULDBLOCK错误,表明请过会儿再发。TCP传输是有多少就收多少,如果没有数据, 阻塞Socket就会等数据,直到有数据,非阻塞Socket不好等,而是返回WSAEWOULDBLOCK。UDP,如果没有数据,阻塞Socket就会等,非阻塞Socket也返回WSAEWOULDBLOCK。如果有数据,它是会等整个发包到齐,并接收到整个发包,才返回。
WecanHuang 2006-05-27
  • 打赏
  • 举报
回复
up

18,363

社区成员

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

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