to ArLi2003: 我是用TcpClient来连接的,用NetworkStream来获得数据流,可以就根据这个数据流来获得发送方的IP地址吗??或是我需要使用Socket的连接来从新做一次程序,好像Socket才有EndPoint这个东西。。 另外,我已经解决了销毁进程的问题,方法如下: Process[] p = Process.GetProcessesByName("Test_ReSeGe");//Test_ReSeGe是我进程的名字 foreach(Process process in p) { process.Kill(); }
而ASP 有一个隐藏参数:Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持2,Thread.Abort 本来就会获发错误,因为你是不正常的强制中止,规则限定必须引发错误让你来处理后事参见:http://expert.csdn.net/Expert/TopicView1.asp?id=1908930
而ASP 有一个隐藏参数:Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持2,Thread.Abort 本来就会获发错误,因为你是不正常的强制中止,规则限定必须引发错误让你来处理后事参见:http://expert.csdn.net/Expert/TopicView1.asp?id=1908930
我是用TcpClient来连接的,用NetworkStream来获得数据流,可以就根据这个数据流来获得发送方的IP地址吗??或是我需要使用Socket的连接来从新做一次程序,好像Socket才有EndPoint这个东西。。
另外,我已经解决了销毁进程的问题,方法如下:
Process[] p = Process.GetProcessesByName("Test_ReSeGe");//Test_ReSeGe是我进程的名字
foreach(Process process in p)
{
process.Kill();
}
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向自己发送信息)。大家知道为什么吗????
tcpClient.Receive(....);根本不必考虑对方什么端口什么IP而 .AcceptSocket 是S 端使用自增型数值,它用来保证端口不会出现冲突,所以基本上应答后的socket 和侦听前是不同的,因为二者是二个socket,侦听(listener) 在.AcceptSocket 还可能要继续侦听下一个,它只是将当前的连接请求同意,然后转移到新的socket 对象(tcpClient)
我最终目的其实是想实现点对点的文件传送,这就需要用NetworkStream转换成FileStream吧,所以获得对方的IP和端口其实是为了用NetworkStream。如果我用tcpClient.Send(...); tcpClient.Receive(....); 是否一样可以把其转换成FileStream呢??我没有做过,可以的话,我会马上用Send和Receive做的。
非常感谢版主对我这些幼稚的问题一再地作详细的回答,真谢谢你了!!
请问版主,如果我用tcpClient.Send(...)发信息的话,可以用NetworkStream接收吗??
myNetworkStream = new NetworkStream(tcpClient, FileAccess.ReadWrite, true);
if (myNetworkStream.DataAvailable) {
myNetworkStream.Read...在S 端也是一样不需要考虑ip 和端口呀,因为每一个listener 的AcceptSocket(); 都会产生该交互过程中唯一的socket 对象,多个AcceptSocket() 不会互相干扰的哩