说错了,应该是销毁进程才对,sorry!!

解决方案 »

  1.   

    1,你必须先研习一下sock 和tcp/ip任何一台机子在使用网关上网的话,都没有外网的IP 地址,简单的说,IP只是应答所在地址,和sock 通讯并无直接关系,有关系的是端口,在共享方式下:例如:B机向网关A机(或路由)提出连接到 地址C 的80 端口,则B机开启端口如1033,将请求提交给网关,网关再开启一个端口如1044 由这个端口向地址C 的80 端口进行连接,此时有个内网地址转换(NAT,参考: http://www.net130.com/technic/001/0057.htm)负责所有端口的数据传送到相应的内网机子,比如上面的1044 的所有数据都会自动转移到B 机的1033 端口,所以在地址C 的80 端口是无法直接得知位于内局的B 机的任何资料,它只知道也只和网关A 的端口1044打交道。所以你在编程时如果你是Server 端则不必考虑什么内网问题,但如果是C 端要连接到B 机的S端就要注意,因为B机上如果不是主动请求(因为是本地listener 而不是向网关发出主动连接)的话那么侦听是无效的,必须做端口映射,因为如上例,B机监听的是1033 但网关并不知道,所以外网请求B机的1033 时连接的是网关,由于网关没有做1033 端口映射而自己又没有开启1033 端口所以会造成外网无法连接的问题。所以说如果内网的机子要做S端进行侦听的话必须做端口映射。至于如何获得IP 则可以用:sockServer.RemoteEndPoint
    而ASP 有一个隐藏参数:Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持2,Thread.Abort 本来就会获发错误,因为你是不正常的强制中止,规则限定必须引发错误让你来处理后事参见:http://expert.csdn.net/Expert/TopicView1.asp?id=1908930
      

  2.   

    1,你必须先研习一下sock 和tcp/ip任何一台机子在使用网关上网的话,都没有外网的IP 地址,简单的说,IP只是应答所在地址,和sock 通讯并无直接关系,有关系的是端口,在共享方式下:例如:B机向网关A机(或路由)提出连接到 地址C 的80 端口,则B机开启端口如1033,将请求提交给网关,网关再开启一个端口如1044 由这个端口向地址C 的80 端口进行连接,此时有个内网地址转换(NAT,参考: http://www.net130.com/technic/001/0057.htm)负责所有端口的数据传送到相应的内网机子,比如上面的1044 的所有数据都会自动转移到B 机的1033 端口,所以在地址C 的80 端口是无法直接得知位于内局的B 机的任何资料,它只知道也只和网关A 的端口1044打交道。所以你在编程时如果你是Server 端则不必考虑什么内网问题,但如果是C 端要连接到B 机的S端就要注意,因为B机上如果不是主动请求(因为是本地listener 而不是向网关发出主动连接)的话那么侦听是无效的,必须做端口映射,因为如上例,B机监听的是1033 但网关并不知道,所以外网请求B机的1033 时连接的是网关,由于网关没有做1033 端口映射而自己又没有开启1033 端口所以会造成外网无法连接的问题。所以说如果内网的机子要做S端进行侦听的话必须做端口映射。至于如何获得IP 则可以用:sockServer.RemoteEndPoint
    而ASP 有一个隐藏参数:Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持2,Thread.Abort 本来就会获发错误,因为你是不正常的强制中止,规则限定必须引发错误让你来处理后事参见:http://expert.csdn.net/Expert/TopicView1.asp?id=1908930
      

  3.   

    to ArLi2003:
       我是用TcpClient来连接的,用NetworkStream来获得数据流,可以就根据这个数据流来获得发送方的IP地址吗??或是我需要使用Socket的连接来从新做一次程序,好像Socket才有EndPoint这个东西。。
       另外,我已经解决了销毁进程的问题,方法如下:
        Process[]  p = Process.GetProcessesByName("Test_ReSeGe");//Test_ReSeGe是我进程的名字
    foreach(Process process in p)
    {
    process.Kill();
    }
      

  4.   

    我已经可以接收到发送者的IP地址了。而如果对方处于一个局域网中,路由器对其机器实行了地址映射,为了准确把回答信息发送到对方的计算机上,我必须把数据流发送到对方路由器的相对应的端口上,我该如何获得这个Port呢??应该是在它发送信息过来的时候就可以收到的吧,就和获取它的IP地址一个原理,但不清楚该用哪个语句来获取!!
      

  5.   

    非常奇怪,我使用如下语句来获得发送端的IP地址以及端口:
    System.Net.Sockets.Socket tcpClient = listener.AcceptSocket ();
    System.Net.IPEndPoint ReceiveClientIP = (IPEndPoint)tcpClient.RemoteEndPoint;
    this.ReceiveClientIPForString = ReceiveClientIP.Address.ToString();
    this.ReceiveClientPortForString = ReceiveClientIP.Port.ToString();
    经过检验,所获得的IP地址是正确的,但端口就很奇怪,每一次发送信息所得到的数值都不同(我用自己的机器,把IP设为127.0.0.1,端口为60001向自己发送信息)。大家知道为什么吗????
      

  6.   

    晕你的socket 编程可有不少问题哩,你做侦听时根本不要知道对方的XX和XX比如:System.Net.Sockets.Socket tcpClient = listener.AcceptSocket();以后要发送和接收只要:tcpClient.Send(...);
    tcpClient.Receive(....);根本不必考虑对方什么端口什么IP而 .AcceptSocket 是S 端使用自增型数值,它用来保证端口不会出现冲突,所以基本上应答后的socket 和侦听前是不同的,因为二者是二个socket,侦听(listener) 在.AcceptSocket 还可能要继续侦听下一个,它只是将当前的连接请求同意,然后转移到新的socket 对象(tcpClient)
      

  7.   

    http://expert.csdn.net/Expert/TopicView1.asp?id=1908930 里面有个例子你可以参考一下
      

  8.   

    to ArLi2003:
       我最终目的其实是想实现点对点的文件传送,这就需要用NetworkStream转换成FileStream吧,所以获得对方的IP和端口其实是为了用NetworkStream。如果我用tcpClient.Send(...);  tcpClient.Receive(....); 是否一样可以把其转换成FileStream呢??我没有做过,可以的话,我会马上用Send和Receive做的。
       非常感谢版主对我这些幼稚的问题一再地作详细的回答,真谢谢你了!!
      

  9.   

    话说回来,我一开始是用TcpClient做的连接,谁知道它没有像Socket那样的RemoteEndPoint来查询发送端IP,搞得我又把程序改为Socket的连接,5555555555
    请问版主,如果我用tcpClient.Send(...)发信息的话,可以用NetworkStream接收吗??
      

  10.   

    我建议你还是用明晰的socket send/receive 更好,它比流要明确,特别是在发送特殊字符时比如控制符之类的,虽然流化可以简单的将它看做一个文件一个字符串但它始终是经过加壳的至于socket 的发送和接收的方法你可以参见我上面那个地址里的例子。一定要用流的话可以:
    myNetworkStream = new NetworkStream(tcpClient, FileAccess.ReadWrite, true);
    if (myNetworkStream.DataAvailable) {
     myNetworkStream.Read...在S 端也是一样不需要考虑ip 和端口呀,因为每一个listener 的AcceptSocket(); 都会产生该交互过程中唯一的socket 对象,多个AcceptSocket() 不会互相干扰的哩
      

  11.   

    版主,今天一直在背单词,没有时间尝试一下你的方法。刚才终于搞定了,还是用回了NetworkStream,因为我的程序都是用tcpClient的,就懒得改了,呵呵终于搞定,可以结贴了。感谢版主的指教我学到了不少东西!!