简单的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
不胜感激!