读书人

一个socket异步链接的有关问题,就指教

发布时间: 2012-02-23 22:01:35 作者: rapoo

一个socket异步链接的问题,就指教!
我服务端

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了!


[解决办法]
以上基本都差不多了,记得导入库Ws2)32.lib
初始化WSAStartup()

还有服务器一定要有accept客服端才能连接上

读书人网 >VC/MFC

热点推荐