小弟最近才开始学习vc,编了个csocket传输的简单程序,程序有一个接收线程跟一个发送线程,接收线程(当服务器用)调用csocket的create(port),bind()listen(),accept()函数,发送线程(当客户端用)用的是create()和connect(ip,port);在局域网内跟另外一台电脑的连接没有问题,使用的是网内的地址如192.168.1.23.但是和外网的电脑连接的时候却连接不上,请问是不是在ip地址的连接方面有什么问题.
我的bind的port都是设置同一个端口,ip是通过函数获取的本地ip,函数调用在listen之前.不知道在什么地方有错误.
还有就是想问一下如果我的程序在一个局域网内的两台电脑上运行,都是监听一个端口,但是他们和外网通信时都用一个ip,我连接这个ip时候会和谁连上?对网络方面不是很熟悉.谢谢解答

解决方案 »

  1.   

    外网的机器是看不到内网的机器.
    除非你用nat穿透
    多看看网络基础的书吧
      

  2.   

    用tcp和外网链接应该没有问题吧(前提是内网链接外网的机器,既是外网的为服务器)。
    在内网的机器通过nat时会分配另外一个端口的。你要先获得这个分配的端口,外网的机器才可以链接
      

  3.   

    可以在服务器上配置ip转发,把某个port的接入都转发到固定台内网机器
      

  4.   

    那就是说如果我要在两个网之间的电脑上通信的话就要通过服务器设置转发port了?
      

  5.   

    那如果说服务器端跟客户端都不是子网的服务器的话,是不是服务器分配的port都不一样,套接字基本上就没连接上的可能.
    另问:服务器给子网内分配的port是随机分配的吗?
      

  6.   

    从winsock学起,这样会少走很多弯路!我就是从弯路回来的。
    有本<<windows网络编程>> 清华大学出版的,不错的入门书籍。
      

  7.   

    但是我连不上啊,不知道是csocket的用法上有什么不妥的地方
      

  8.   

    我在接收线程的前面是这样的:
    char strHostName[128];
    memset(strHostName,0,128);
    if(gethostname(strHostName,128)==SOCKET_ERROR)
    {
    PostMessage(g_hMain,WM_MYMESSAGE,5,0);
    CReceiveThread::EndThread();
    }
    CString str;
    CString ip;
    str.Format("%s",strHostName);
    HOSTENT *pHS=gethostbyname(str.GetBuffer(str.GetLength()));
    if(pHS!=NULL)
    {
    int i=0;
    while(pHS->h_addr_list[i])ip+=inet_ntoa(*(struct in_addr*)pHS->h_addr_list[i++]);
    }
    while(m_bRun==TRUE)
    {
    CReceiveSocket Tempsock,Recsock;//CRreceiveSocket是由CSocket派生的,没改写.
    if(!Tempsock.Create(6555))
    {
    Sleep(100);
    continue;
    }
    if(Tempsock.Bind(6555,ip))
    {
    Tempsock.Close();
    Sleep(100);
    continue;
    }
    if(!Tempsock.Listen())
    {
    Tempsock.Close();
    Sleep(200);
    continue;
    }
    Tempsock.Accept(Recsock);
                      ...
                      ...
                }
    在发送线程是这样的:
                while(m_bRun)
    {
    CSendSocket Sendsock;//CSocket派生,未改写
    memset(ftpNode,0,sizeof(FtpTaskNode));
    if(g_FtpQueue->PickNode(ftpNode))
    {
    if(!Sendsock.Create())
    {
    Sleep(100);
    continue;
    }
    if(!Sendsock.Connect(ftpNode->m_strServerip,ftpNode->m_nPort))
    {
    Sendsock.Close();
    PostMessage(g_hMain,WM_MYMESSAGE,5,0);//提示连接不上,
    continue;
    }
                               ......
                      }
    不知道在什么地方有问题,在局域网里能和其他机器连上.
      

  9.   

    ftpNode->m_strServerip是外网的ip吗?
      

  10.   

    你用WASGetLastError看看返回值是多少?
      

  11.   

    to littlebao(爱拼才会赢):1,是外网ip.2.我跟自身连用外网ip的话返回0
      

  12.   

    我把WSAGetLastError的调用放在connect返回零的时候,为什么返回的是0呢,明明连接已经失败了
      

  13.   

    connect返回0就是表示成功了吧!