问题描述
我的机器是处在公网,用UdpClient类的Receive()方法来接收信息,但这个方法只能得到信息内容,不能得到信息从哪个IP、端口而来。两台机器都在公网还好做,就把自已的IP打包成数据发送过去就行了。如果有一台机器在内网,内网的机器使用Dns.GetHostEntry(Dns.GetHostName())也只能得到内网IP,打包内网IP发过去也没用了。只要接收方能够得到发信息方的IP和端口就好办了。很急,知道的朋友帮帮忙啊。
解决方案
解决方案二:
Receive需要一下IPEndPoint参数啊,它会返回IP地址的你是没发过帖子导致结贴率为0还是从来没结过?
解决方案三:
C#技术交流群:55180062一起学习,一起成长
解决方案四:
是啊,我是第一次来CSDN,朋友介绍的
解决方案五:
引用1楼cpio的回复:
Receive需要一下IPEndPoint参数啊,它会返回IP地址的你是没发过帖子导致结贴率为0还是从来没结过?
IPHostEntryiphost=newIPHostEntry();iphost=Dns.GetHostEntry(Dns.GetHostName());IPEndPointipend=newIPEndPoint(iphost.AddressList[0],11000);UdpClient=newUdpClient(ipend);byte[]recvData=uc.Receive(refipend);stringrecvString=System.Text.Encoding.UTF8.GetString(recvData);我是这样写的,但接收到的只有发来的信息内容,没有对方的IP和端口号
解决方案六:
自已顶一下
解决方案七:
个人认为二楼说得没错,MSDN中的例子://CreatesanIPEndPointtorecordtheIPAddressandportnumberofthesender.//TheIPEndPointwillallowyoutoreaddatagramssentfromanysource.IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);try{//Blocksuntilamessagereturnsonthissocketfromaremotehost.Byte[]receiveBytes=receivingUdpClient.Receive(refRemoteIpEndPoint);...
Receive调用完成后,RemoteIpEndPoint里面就应该是实际发送方的相关信息了。ref不是白ref的。
解决方案八:
我还见过先IPEndPointremoteEP=null;的,做一次Receive,之后再Send的时候,就可以持续用remoteEP了。感觉这么写很自然。开始不知道谁发来消息,一旦收到谁的消息(报文)了,就回应对方。
解决方案九:
我晕。。。byte[]recvData=uc.Receive(refipend);Receive返回已由远程主机发送的UDP数据。publicbyte[]Receive(refIPEndPointremoteEP)remoteEP就是你说的对方ip和端口。。。msdn的备注(虽然中文翻译的叫人难受,但是大概说明白了)备注Receive方法将阻止,直到数据报从远程主机到达为止。如果数据可用,则Receive方法将读取入队的第一个数据报,并将数据部分作为字节数组返回。此方法使用发送方的IPAddress和端口号来填充remoteEP参数。如果在Connect方法中指定了默认远程主机,则Receive方法将只接受来自该主机的数据报。其他所有数据报将被丢弃。如果收到SocketException,请使用SocketException.ErrorCode获取特定的错误代码。获取该代码后,可以参考MSDN中的WindowsSocketsversion2API(Windows套接字第2版API)错误代码文档以获取有关错误的详细说明。
解决方案十:
byte[]data=udpClient.Receive(refendPoint);接收完后参数endPoint会被设置成对方的地址,所以上一句执行完后:endPoint.Address就是对方ipendPoint.Port就是对方端口