公司上网用无线网卡,网卡ip为192.168.1.2
在家上网用有线网卡,网卡ip为192.168.2.2
一个socket程序,客户端,
在公司测试,设置服务端ip为192.168.1.0,没报错,
到家,运行后报错,如下图
经过一番折腾后发现,如果将 ip 192.168.X.0 的 X 设置的和本机使用中网卡的ip一个网段,就没事;
这个错误还真的没思路去解决

解决方案 »

  1.   

    574在该函数内void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
    {
    if (wParam == 0 && lParam == 0)
    return; // Has the socket be closed?
    CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE); // If yes ignore message
    if (pSocket != NULL)
    return; pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);
    if (pSocket == NULL)
    {
    // Must be in the middle of an Accept call
    pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
    ASSERT(pSocket != NULL);//  574在这里
    if(pSocket == NULL)
    return;

    pSocket->m_hSocket = (SOCKET)wParam;
    CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
    CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
    } int nErrorCode = WSAGETSELECTERROR(lParam);
    switch (WSAGETSELECTEVENT(lParam))
    {
    case FD_READ:
    {
    fd_set fds;
    int nReady;
    timeval timeout; timeout.tv_sec = 0;
    timeout.tv_usec = 0; FD_ZERO(&fds);
    FD_SET(pSocket->m_hSocket, &fds);
    nReady = select(0, &fds, NULL, NULL, &timeout);
    if (nReady == SOCKET_ERROR)
    nErrorCode = WSAGetLastError();
    if ((nReady == 1) || (nErrorCode != 0))
    pSocket->OnReceive(nErrorCode);
    }
    break;
    case FD_WRITE:
    pSocket->OnSend(nErrorCode);
    break;
    case FD_OOB:
    pSocket->OnOutOfBandData(nErrorCode);
    break;
    case FD_ACCEPT:
    pSocket->OnAccept(nErrorCode);
    break;
    case FD_CONNECT:
    pSocket->OnConnect(nErrorCode);
    break;
    case FD_CLOSE:
    pSocket->OnClose(nErrorCode);
    break;
    }
    }现在公司,用的是192.168.1.2的ip上网,刚试了下,程序内设置的ip 192.168.1.1也同样会报错
      

  2.   

    你创建socket的代码 怎么写的 ?
      

  3.   

    BOOL C***::CreateTCPServer(ClientSocket* pSocket, const UINT& uPort)
    {
    BOOL bError = FALSE;
    int nError = 0;
    CString sIP; bError = pSocket->Create(uPort);
    if (bError == FALSE)
    {
    nError = ::GetLastError();
    //TRACE("Create() Error:%d\r\n", nError);
    pSocket->Close();
    return FALSE;
    } bError = pSocket->Listen();
    if (bError == FALSE)
    {
    nError = ::GetLastError();
    //TRACE("AsyncSelect() Error:%d\r\n", nError);
    pSocket->Close();
    return FALSE;
    } return TRUE;}
    BOOL C***::CreateTCPClient(ClientSocket* pSocket, const CString& sIP, const UINT& uPort)
    {
    BOOL bError = FALSE;
    int nError = 0; bError = pSocket->Create();
    if (bError == FALSE)
    {
    nError = ::GetLastError();
    //TRACE("Create() Error:%d\r\n", nError);
    pSocket->Close();
    return FALSE;
    } bError = pSocket->AsyncSelect();
    if (bError == FALSE)
    {
    nError = ::GetLastError();
    //TRACE("AsyncSelect() Error:%d\r\n", nError);
    pSocket->Close();
    return FALSE;
    }
    bError = pSocket->Connect((LPCTSTR)sIP, uPort);
    if (bError == FALSE)
    {
    nError = ::GetLastError();
    //  如果是返回值为10035的话,代表该SOCKET不能立即返回,
    //  你应该在OnConnect中响应是否连接成功的消息。
    //  这不是连接不成功的问题。
    //TRACE("Connect() Error:%d\r\n", nError);
    if (nError != WSAEWOULDBLOCK)
    {
    //TRACE("Connect() Error:%d\r\n", nError);
    pSocket->Close();
    return FALSE;
    }
    } return TRUE;
    }
      

  4.   

    肯定要同一网段才能通信啊 就算网络中的通信也是一样的 公网IP也是同一网段的 不同的只是中间加了路由 这里的功能只是 公用一个公网IP 最后通信还是会转换的  同一网段下才能通信
      

  5.   

    你只要把IP 换成同一网段下就可以通信了啊 服务端IP多少 你客户端连服务端IP就可以了啊
      

  6.   

    Debug下调试,call stack,看看运行到哪句出错了,先找到出错的地方
      

  7.   

           
    ASSERT(pSocket != NULL);//  574在这里
            
    if(pSocket == NULL)
                return;这位仁兄你的这两句话表达的都是一个意思是吧?
    你试试吧assert注释掉,看看是否在if(pSocket == NULL)这里出错,如果是,那么就要看看你pSocket定义中这个pSocket的值是什么,你大可以把判断pSocket是否为NULL的语句都注释掉,然后运行程序,看看第一次这个pSocket是否得到了值.
    我怀疑可能你这个陷入了某种死循环,一直在判断pSocket是否为NULL,而且没有超时机制,很有可能是这原因..
      

  8.   

    晕,assert都不会调试?重试,中断,调用堆栈
      

  9.   

    这就是奇怪的地方,socket成功,不应该跳进雷区的,