一个socket异步链接的问题,就指教!
我服务端
BOOL CServer::InitAndListen(HWND hwnd,UINT port){ m_uPort=port; m_hWnd=hwnd; if(m_hSocket!=NULL) { //如果已经创建了套接字,就要先关闭原来的 closesocket(m_hSocket); m_hSocket=NULL; } if(m_hSocket==NULL) { //创建新的套接字,这里创建的是流类型的套接字 m_hSocket=socket(AF_INET,SOCK_STREAM,0); ASSERT(m_hSocket!=NULL); ServerInit(); } m_addr.sin_family=AF_INET; m_addr.sin_addr.S_un.S_addr=INADDR_ANY; m_addr.sin_port=htons(m_uPort); int ret=0; int error=0; //判定一个套接字到本机的地址 ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)); if(ret==SOCKET_ERROR) { //判定错误 AfxMessageBox("binding error!"); return FALSE; } //开始一个监听过程,等待客户的链接 ret=listen(m_hSocket,5);//第二个参数表示最多支持的客户连接数 if(ret==SOCKET_ERROR) { AfxMessageBox("listen error!"); return FALSE; } return TRUE;}BOOL CClient::InitAndConnect(HWND hwnd,UINT port,CString strserver){ m_hWnd=hwnd; m_uPort=port; m_strServer=strserver; unsigned long ul; if(m_hSocket!=NULL) { //如果原来打开这个套接字,则先关闭 closesocket(m_hSocket); m_hSocket=NULL; } if(m_hSocket==NULL) { //创建新的流套接字 m_hSocket=socket(AF_INET,SOCK_STREAM,0); ASSERT(m_hSocket!=NULL); ClientInit(); } //准备服务器的信息,这里需要指定服务器的地址 m_addr.sin_family=AF_INET; m_addr.sin_addr.S_un.S_addr=inet_addr(m_strServer.GetBuffer(0)); m_addr.sin_port=ntohs(m_uPort); //这里主动链接服务器,该过程将要等待一定时间 int ret=0; int error=0; ret=connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)); if(ret==SOCKET_ERROR) { CString m_CharWords; LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL); m_CharWords=(char *)lpMsgBuf; LocalFree( lpMsgBuf ); //连接失败 if(GetLastError()!=WSAEWOULDBLOCK) { AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!")); return FALSE; } } return TRUE;}
[解决办法]
以上基本都差不多了,记得导入库Ws2)32.lib
初始化WSAStartup()
还有服务器一定要有accept客服端才能连接上