异步套接字 connect返回-1

来源:互联网 发布:国家调查数据库 编辑:程序博客网 时间:2024/06/05 16:36

由于没有系统的学习网络编程,许多概念很模糊,之前也用socket编过小软件,不是mfc的那个类,是API,connect成功后返回0,失败返回-1,这几天又写关于网络通信的软件,是 客户端的,有收也有发,之前的解决方法是,阻塞套接字+多线程,但是我看到书上有种方法很好,用异步套接字,非阻塞的,于是就按照书上写的,用的是,WSAAsyncSelect(),试了下,发现,在connect时,连接上返回-1,很纳闷

就上网查资料,用GetLastError()得到10035,10035的意思是:无法立即完成一个非阻挡性套接字操作。网上有很多大大,我就按照他们的方法试了试,在WSAAsyncSelect( SKTClient, hwnd, WM_SOCKET, FD_CONNECT | FD_READ )中加入FD_CONNECT,在消息响应函数中用switch,FD_CONNECT和FD_READ,结果成功了。

    原来调用 WSAAsyncSelect 函数之后,就会将SOCKET设置成“异步选择”的I/O模型,这个时候,对于SOCKET的操作就是异步的了,而且是和Windows的消息机制紧密结合了。在这个之后,connect等函数的操作结果(成功或不成功)都不是通过函数的返回值提现的。而是在链接成功后,通过消息机制通知应用程序。

以下是部分代码:

WSAAsyncSelect(s,this->m_hWnd,WM_SOCKET,FD_CONNECT|FD_READ);

void CPcTCPDlg::OnSocket(WPARAM wParam,LPARAM lParam){char buf[100]={0};CString str="";int iEvent = WSAGETSELECTEVENT(lParam); //消息类别 int iErrorCode = WSAGETSELECTERROR(lParam); //错误代码switch(lParam)  {  case FD_CONNECT: //客户端连接请求事件  {  if (iErrorCode == 0) {GetDlgItem(IDC_TEXT)->GetWindowText(str);str+="connected! \r\n";GetDlgItem(IDC_TEXT)->SetWindowText(str);GetDlgItem(IDC_SENDTEXT)->EnableWindow(true);GetDlgItem(IDC_SEND)->EnableWindow(true);GetDlgItem(IDC_ADDR)->EnableWindow(false);GetDlgItem(IDC_PORT)->EnableWindow(false);//AfxMessageBox("连接成功");}else  {GetDlgItem(IDC_TEXT)->GetWindowText(str);str+="connect faliure,please try again! \r\n";GetDlgItem(IDC_TEXT)->SetWindowText(str);}//AfxMessageBox("连接失败");   }  break;case FD_READ:{