最近在写一个类似QQ的聊天工具,通信问题以及其他都考虑的还算可以,现在就遇到了一个问题:客户端的端口映射?服务器怎样去判断客户端端口映射,比如说某几台客户端是通过同一台路由器的端口映射来进行与服务器联系,然而服务器是怎么判断呢?它们的IP地址都是一样的,就端口不一样,这怎么判断?求助中。

解决方案 »

  1.   

    建立TCP连接,每个客户端都会有唯一的一个连接句柄,互不影响,互不干扰!
    服务器那边根据连接的句柄判断是哪个客户端在通信.当然连接之后最好发送一些唯一标识,如QQ号码,用这个唯一标识来与这个连接句柄绑定,以后就可以根据这个QQ号来查找到对应的连接,使用这个连接就可以向指定的客户端发送信息了.
      

  2.   

    客户端成功连接服务端以后,服务端利用accept返回的SOCKET句柄就可以和客户端通讯了(以TCP为例)
      

  3.   

    tcp 服务器不用去担心啥客户端口nat. ..因为他建立了连接
      

  4.   

    主要是有一个问题想不通,就是当客户端连接到服务器时,假如拿客户端的ip做标识的话,当几个客户端通过一台路由器来连接的,那么它们的IP都是路由器的外网IP,就不好标识了。
      

  5.   

    luchao002,你好,怎么标识?我只知道用IP来标识?你能否详细一点吗?
      

  6.   

    .................
    无论是tcp还是udp都能得到端口啊...
    accept函数和recefrom函数都可以啊,从套接字也能得到啊
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    难道你看到这参数就没有一点感受??????????............
      

  7.   

    我说的那种发送唯一标识是在你连接建立后,立刻发送一条数据到服务器,告诉他我是ID号是多少,这个ID是事先注册好的,在你的数据库中唯一,如CSDN论坛ID号,每个人唯一.
    当然也可以用IP+PORT来作唯一标识:sockaddr_in sender;
    int dwSender = sizeof(sender);
    SOCKET mainSocketConn = accept(mainSocket,(SOCKADDR *)&sender , &dwSender);char szMsg[255];
    sprintf(szMsg,"地址是%s,端口号是%d",inet_ntoa(sender.sin_addr),ntohs(sender.sin_port));得到IP和端口号后,可以将其组合成一个字符串,这个字符串应该就是相对唯一的.
      

  8.   

    哦,谢谢了,我懂了,我采用的是端口对应IP来标识。
    try
    {
    SOCKADDR_IN clientAddr;
    int len=sizeof(SOCKADDR);
    conn->GetPeerName((SOCKADDR*)&clientAddr,&len);
    CString strIP;
    strIP.Format("%s",inet_ntoa(clientAddr.sin_addr)); int port=clientAddr.sin_port;
    CString ReturnIP;
    ReturnIP.Format("%d",port); strIP=strIP+":"+ReturnIP;
    return strIP;
    }
    catch(CException e)
    {
    e.ReportError();
    e.Delete();
    return "";
    }