一个socket异步链接的有关问题,就指教
一个socket异步链接的问题,就指教!
我服务端
已经开始监听了
客户端链接的代码
为什么总是在connect的时候出错 返回值为-1 我看了下 错误信息 说的是
无法立即完成一个非阻止性套接字操作
什么原因
求高手指教!!!
------解决方案--------------------
服务端还希accept操作,进行客户端连接
------解决方案--------------------
是IO_PENDING么? 是的话,就是说明你的套接字是非阻塞的,那么这个错误是正常的。
你需要继续监听这个套接字的可写事件,这时它才算真正连接成功了。
------解决方案--------------------
你的服务器有accept操作吗?
------解决方案--------------------
因为你用的是Windows底层的套接字编程方式,所以使用套接字之前应该要初始化ws2_32.dll,其实你在bind时就应该已经出错了.
你可在使用套接字的前面加入下面的代码:
WORD wVersionRequested;
int err;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
/* Tell the user that we couldn't find a usable */
/* WinSock DLL. */
return -1;
}
------解决方案--------------------
刚才指的是在服务器端加代码
------解决方案--------------------
你connect的时候,服务器端由accept的调用吗?
------解决方案--------------------
楼上两位说的对啊,缺少了accept了!
我服务端
- C/C++ code
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; }
已经开始监听了
客户端链接的代码
- C/C++ code
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; }
为什么总是在connect的时候出错 返回值为-1 我看了下 错误信息 说的是
无法立即完成一个非阻止性套接字操作
什么原因
求高手指教!!!
------解决方案--------------------
服务端还希accept操作,进行客户端连接
------解决方案--------------------
是IO_PENDING么? 是的话,就是说明你的套接字是非阻塞的,那么这个错误是正常的。
你需要继续监听这个套接字的可写事件,这时它才算真正连接成功了。
------解决方案--------------------
你的服务器有accept操作吗?
------解决方案--------------------
因为你用的是Windows底层的套接字编程方式,所以使用套接字之前应该要初始化ws2_32.dll,其实你在bind时就应该已经出错了.
你可在使用套接字的前面加入下面的代码:
WORD wVersionRequested;
int err;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
/* Tell the user that we couldn't find a usable */
/* WinSock DLL. */
return -1;
}
------解决方案--------------------
刚才指的是在服务器端加代码
------解决方案--------------------
你connect的时候,服务器端由accept的调用吗?
------解决方案--------------------
楼上两位说的对啊,缺少了accept了!