socket 用WSAAsyncSelect 方式做的非阻塞通信方式,
在局域网 测试 运行正常,但在外网测,只能服务器向客户端发数据,
客户端向服务器发的数据服务器收不到,
请教一下,这个可能是什么原因造成的?

解决方案 »

  1.   

    比如可以先不用selete异步模式,写个很简单的阻塞的请求-应答程序,从外网调,看看能不能行。
      

  2.   

    用delphi做的socket通信 测试的,网络应该没问题,
    而且delphi得程序,连接速度 ,好像要比VC这个快的多
    真郁闷了..
      

  3.   

    已经 看到 send函数 的返回值 就是要发送的字节数
    但是 在服务器端 就是收不到,,FD_READ 收不到啊
      

  4.   

    发送代码void CServerSocket::SendBuffer(SOCKET &hSocket)
    {
    ASSERT(hSocket != NULL);
    int nSendSize = 0;
    while (TRUE)
    {
    nSendSize = send(hSocket,m_PacketProtocal.pSendBuffer+m_PacketProtocal.sSendBufferInfo.nSendLen,m_PacketProtocal.sSendBufferInfo.nPacketLen-m_PacketProtocal.sSendBufferInfo.nSendLen,0);
    if (nSendSize > 0)
    {
    m_PacketProtocal.sSendBufferInfo.nSendLen += nSendSize;
    if (m_PacketProtocal.sSendBufferInfo.nSendLen == m_PacketProtocal.sSendBufferInfo.nPacketLen)
    {
    m_PacketProtocal.sSendBufferInfo.nSendLen = 0;
    m_PacketProtocal.sSendBufferInfo.nPacketLen=0;

    return;
    }
    }
    else if (nSendSize == WSAEWOULDBLOCK ) 
    {
    PostMessage(m_hWnd,WM_WRITEMSG,2,0); m_strInfoMsg.Format("发送动作SendBuffer出现阻塞,错误信息:%d",WSAGetLastError());
    WriteLog("文件传输",m_strInfoMsg,"失败");
    return;
    }
    else if (nSendSize == SOCKET_ERROR)
    {
    m_strInfoMsg.Format("发送SendBuffer出现错误,错误信息:%d",WSAGetLastError());
    WriteLog("文件传输",m_strInfoMsg,"失败");
    return;
    }
    else if (nSendSize == WSAETIMEDOUT)
    {
    m_strInfoMsg.Format("发送SendBuffer出现超时错误,错误信息:%d",WSAGetLastError());
    WriteLog("文件传输",m_strInfoMsg,"失败");
    return;
    }
    else 
    if (nSendSize == 0 )
    return;
    }}
    接受函数 设的断点压根就进不去。。
      

  5.   

    send函数 的返回值 就是要发送的字节数
    没有 错误记录
      

  6.   

    端口有未映射?有未防火墙阻挡? 内网到外网是经过了NAT地址转换的
      

  7.   

    代码错。if(size == sock_erro)
    {
    再去getlaster erro,再去判断是否pending.
    }
      

  8.   

    嗯,谢谢,这个写法确实 有问题.
    但是 send发送 值是 大于零的, 但是 接收端 不管 对错,都收不到相关消息
      

  9.   

    你的hSocket句柄是你用connect()时的句柄吗