在Windows XP SP2版本下,使用VC++6.0编译器,在MFC工程文件下编程,使用Winsock2.0进行网络通信。
代码如下:
WSADATA wsaData;//初始化
WORD version = MAKEWORD(2,0);
int ret = WSAStartup(version,&wsaData);
if(ret != 0)
{
AfxMessageBox("Failed in initial socket");
return FALSE;
}BOOL CAttackerDlg::InitAndConnect(CString server)//运行后会首先调用这个函数进行连接
{
CString strServer = server,buf;//strServer是要连接的IP地址
int failcount = 0,ret = 0;
fd_set conn;
timeval timeout; timeout.tv_sec = 20;
timeout.tv_usec = 0; if(m_hSocket != NULL)
{
closesocket(m_hSocket);
m_hSocket = NULL;
infopen("socket不为空,现在关闭");
}
if(m_hSocket == NULL)
{
m_hSocket = socket(AF_INET,SOCK_STREAM,0);
ASSERT(m_hSocket != NULL);
FD_ZERO(&conn);//清空
FD_SET(m_hSocket, &conn);//添加
if(WSAAsyncSelect(m_hSocket,m_hWnd,MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT) > 0)
{
AfxMessageBox("Error in select");
}
} m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = inet_addr(strServer.GetBuffer(0));
m_addr.sin_port = htons(port);//port是要连接的端口 /********************************************************
* 建立连接(非阻塞) *
********************************************************/
do{
ret = connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr));
if(ret == SOCKET_ERROR)//查看返回值是否正常
{
if((WSAGetLastError()) != WSAEWOULDBLOCK)//问题就在这里,connect返回的错误值用WSAGetLastError()得到的代号是5——拒绝访问……
{
AfxMessageBox(_T("连接失败!"));
return FALSE;
}
}

if(!FD_ISSET(m_hSocket,&conn))//确认
{
FD_ZERO(&conn);
FD_SET(m_hSocket, &conn);
}
ret = select(NULL,NULL,&conn,NULL,&timeout);//等待 if(ret > 0)//判断是否超时
{
return TRUE;
}else if(0 == ret)
{
failcount++;
infopen(buf);
}else
{
AfxMessageBox(_T("请检查错误!"));
return FALSE;
}
}while(failcount < 3);//判断是否超时3次
return FALSE;
}请高人指教,多谢多谢