用VC写的一个聊天软件,局域网用IP:192.168.1.101来创建服务器;客户端直接连接192.168.1.101就可以进行聊天现在我想用我的电脑(XP系统)做一个外网的小型服务器,那么外网用哪个IP地址来创建服务器呢??还是用192.168.1.101这个吗,或是通过使用花生壳获取域名的IP地址183.1.213.141来创建服务器呢??还有客户端程序要连接哪一个IP地址,是192.168.1.101还是183.1.213.141这个??为什么我用183.1.213.141创建SOCKET会不成功??

解决方案 »

  1.   

    一般的局域网需要在路由器上映射一个端口给一个IP  这样外网就能与这个IP:端口 通信 
      

  2.   

    创建服务器需要IP? LZ该好好看看书了 
      

  3.   

    服务器端程序:
    CString sIPAddress;
    struct hostent FAR *lpHostEnt=gethostbyname("chymezh.gicp.net");
    if(lpHostEnt == NULL)
    {
    sIPAddress = _T("");
    }
    LPSTR lpaddr = lpHostEnt->h_addr_list[0];
    if(lpaddr)
    {
    struct in_addr inAddr;
    memmove (&inAddr,lpaddr, 4);
    sIPAddress=inet_ntoa (inAddr);
    if(sIPAddress.IsEmpty())
    sIPAddress=_T("Not available");
    }
    //AfxMessageBox(sIPAddress);
    //获取主机名称
    //char  host[MAX_PATH];
    //gethostname(host,MAX_PATH);
    //m_HostName = host;
    //hostent* phost = gethostbyname(host);
    //if (phost)
    //{
    // char* pIP = inet_ntoa(*(in_addr*)phost->h_addr_list[0]);
    // m_HostIP = pIP;
    //} if(m_SrvSock.m_hSocket == INVALID_SOCKET)
    {
    BOOL bFlag = m_SrvSock.Create(m_iPort,SOCK_STREAM,sIPAddress);
    if(!bFlag)
    {
    AfxMessageBox("Socket 创建失败!");
    m_SrvSock.Close();//关闭监听套接字
    PostQuitMessage(0);//退出窗口
    return;
    }
    }

    m_SrvSock.Init(this);
    if(!m_SrvSock.Listen(15))
    {
    int nErrorCode = m_SrvSock.GetLastError();//检测错误信息
    if (nErrorCode!=WSAEWOULDBLOCK)//如果不是线程被阻塞
    {
         AfxMessageBox("Socket错误!");
    m_SrvSock.Close();//关闭套接字
         PostQuitMessage(0);//关闭窗口
    return;
    }
    }
      

  4.   

    是用花生壳做固定不?
    Server:  ns1.oray.net
    Address:  61.152.96.118Name:    chymezh.gicp.net
    Address:  183.1.100.155
    在路由里面我也设置了虚拟服务器:服务端口:6000;IP地址:192.168.1.101;协议:TCP;启用
    这是端口映射吗??
      

  5.   

    如果你有公网IP的话直接就OK了
    没的话就需要做个端口映射,主要是内网在公网上,一般情况下外网是访问不了的内网的,如果要访问就需要一个映射,可以固定映射
      

  6.   

    使用花生壳,通过域名chymezh.gicp.net我可以获取到我的公网IP为:183.1.213.141
      

  7.   

    CString sIPAddress;
    struct hostent FAR *lpHostEnt=gethostbyname("chymezh.gicp.net");
    if(lpHostEnt == NULL)
    {
    sIPAddress = _T("");
    }
    LPSTR lpaddr = lpHostEnt->h_addr_list[0];
    if(lpaddr)
    {
    struct in_addr inAddr;
    memmove (&inAddr,lpaddr, 4);
    sIPAddress=inet_ntoa (inAddr);
    if(sIPAddress.IsEmpty())
    sIPAddress=_T("Not available");
    }
      

  8.   

    必须有一台位于外网的机器做服务器,192.168.1.101显然是在内网。
    两种方法解决:
    1.路由器里做端口映射,服务端监听这个映射的端口,客户端连路由器的WAN口ip和映射的这个端口就可以了
    2.在路由器里,设置DMZ手机,添上你的IP地址,这样你的机器就完全暴露于外网了。你的服务端可以监听任何一个端口,客户端只需要连接路由器wan口IP和你监听的端口
      

  9.   


    花生壳是针对动态IP的,adsl每次拨号后分配的ip都不同,如果你的程序把ip写死了,路由器一重新拨号ip就变了,花生壳可以解决这个问题。建议先把端口映射做好,先不考虑动态IP的问题。
      

  10.   

    说简单点就是 如何让A子网的客户端知道 非A子网客户端的对外IP和端口 
      

  11.   

    服务器应该放在具有公网IP的机器上  不知道你服务器的消息传递模型是什么样的  是服务器转发还是P2P,还是别的什么要实现广域网的聊天不是很简单把服务端程序放在哪的问题   内网机器通常可以顺利访问外网IP的服务器  但是外网想让数据包顺利进入内网就不是一件容易的事情首先要考虑NAT问题  这个比较容易  在百度上搜索UDP打洞 TCP打洞 资料一大堆   另外要考虑数据包从外网进入内网时所通过的网关防火墙模块  这个通常使用SOCKET5代理 或者你不用代理可以选择使用HTTP TUNNEL技术  源代码是开放的  LZ可以研究下     推荐的组合是 TCP打洞+HTTP TUNNEL(小弟最近也在研究怎么穿透网关的防火墙  正在研究HTTPTUNNEL源代码,无奈关于该技术WINDOWS平台下的资料太少,只能啃linux下的,进度太慢  LZ可以加我Q:349797447  大家共同进步!  ~_~)
      

  12.   

    你得先有一个服务器,用来记录用户的IP地址。
    用户1登录后,服务器记录用户1的IP地址。
    当用户2登陆后,服务器也同样记录用户2的IP地址。
    而用户1和用户2要通信时,就得通过服务器获取对方的IP地址。
      

  13.   

    TCP的话,很好说,做一个端口映射即可。但是,如果是UDP的话,就麻烦些,需要做P2P的打洞技术。