客户机首先用一个套接字 socketa去连接主机的一个端口,这个端口由监听套接字serversocketa负责监听,然后同一客户机用另外一个套接字socketb去连接主机的另外一个端口,这个端口由监听套接字serversocketb负责监听。
现在的问题是 怎么判断连接进来的这两个套接字都是由同一个主机发送的?我知道用getpeername可以得到连接进来的套接字的地址,包括ip地址和端口。但使用这种方法得到的两个地址显然是ip地址相同而端口号不同,但是仅通过ip地址相同好像还不能判断是否是同一个主机发过来的。因为如果有NAT转换,那么同一局域网下发过来的连接应该都是IP地址相同。所以我的问题就是怎么判断两个套接字连接是否来自同一主机?其实我的问题的原因是我要做FTP服务器,做过FTP服务器下载的都知道,下载一个东西需要两个连接,控制连接和数据连接,所以我就是想问这两个连接怎么判断是否是同一主机发送过来的?

解决方案 »

  1.   

    你连接后建立凭证就可以了啊
    用户登录FTP服务器后发送自己的相关信息 比如用户ID不就
    OK了么?
      

  2.   

    upftp协议应该有相关的命令,而且数据传输还分主动,被动模式,首先通过一条链接登录验证监听数据的socket接收到链接后,肯定要问一下对方是否登录了,没登录就直接踢掉,如果对方回了正确的登录信息,才能开始传数据,
      

  3.   

    如果考虑nat的话,你可以在客户端发送数据的时候,把自己机器的ip地址发送到服务器端,然后2着进行验证,就可以了
      

  4.   


    这个IP应该是局域网NAT转化后的IP吧,好像不能判断是不是一个主机吧
      

  5.   

    up不想这样做也不想通过IP,那就读对方的MACFTP 服务器一般被动模式:
      客户端先连接FTP,建立后客户端建立一个监听Socket,并告知FTP,由FTP来连接客户端并发送数据就可以了
      

  6.   

    首先,客户端把自己的本机的IP地址发送到服务器端,然后服务器在接收到客户端的消息后,判断接收过来的ip地址和再客户端发送的ip地址是否一致,如果一直则就是在公网,反之就在nat之后
      

  7.   

    用getpeername()可以得到客户端连接的IP,然后存入指针链表,然后遍历指针链表比较一下,就O啦
      

  8.   


    呵呵,被动模式好像不是这个意思吧,被动模式应该是控制连接发命令后,FTP服务器将另外一个端口发给客户端,然后由客户端新建一个数据连接去连接这个监听。您说的更像是主动连接吧。
    大家好像都没有明白我的意思,我的问题的意思是 判断两个不同套接连接是否来自同一主机呵呵,查看MAC的方法应该行,可是怎么实现?这应该是最底层的协议了。把自己内网的IP发送给服务器也可以把。不过现在我还是觉得换一种方法把。