怎么在收到ICMP请求包后,回复自定义消息

liguicd 2014-02-11 12:31:19
最近在研究ICMP通信,遇到了一个比较郁闷的问题,ICMP请求可以顺利地发送到服务器的接收程序上,但是在回复时,却发现客户端老是接收不到服务器发送过来的自定义消息。大侠们帮忙看看,是否有啥解决思路和办法的。

问题:
怎样才能让客户端接收到服务器端发送过来的自定义消息"good day",
而不是接收到客户端本身之前发出的"howdy pilgrim"?

运行环境:
client处在一个局域网内部,通过一个路由器连到外网,路由器并未作端口映射到client上。
server已经接入外网,拥有独立IP:115.115.115.1(假设)

代码:
ICMP client:

static void Main(string[] args)
{
Ping icmpClient = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
byte[] msg = Encoding.UTF8.GetBytes("howdy pilgrim");

while (true)
{
PingReply reply = icmpClient.Send("115.115.115.1", 60 * 1000, msg, options);
string responseReceived = Encoding.UTF8.GetString(reply.Buffer);
Console.WriteLine(DateTime.Now.ToString() + " Response from server: " + responseReceived);
Thread.Sleep(500);
}
}


ICMP listener:

static void Main(string[] args)
{
while (true)
{
Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
icmpListener.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.3"), 0));
icmpListener.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, null);

byte[] buffer = new byte[1024*1024];
EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
string receivedMsg = Encoding.UTF8.GetString(buffer, 28, bytesRead);
Console.WriteLine(DateTime.Now.ToString() + ": Received " + bytesRead + "B from " + remoteEndPoint + ": " + receivedMsg);

byte[] customResponse = Encoding.UTF8.GetBytes("good day");
int bytesSent = icmpListener.SendTo(customResponse, remoteEndPoint);
}
}


截图
服务器端截图:


客户端截图:


注:
有些人认为是路由器并未作端口映射到client上的缘故,事实上IP层在路由器上传输时,当Client发送一个请求到Server时,沿路的路由器都会临时把这个通道记住的,当Server立即回复(在超时时间内)时,信息是可以顺利返回到Client的,我使用TCP、UDP协议做过测试程序,验证过。
...全文
268 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguicd 2014-02-15
  • 打赏
  • 举报
回复
已经解决,联系QQ249997378
liguicd 2014-02-11
  • 打赏
  • 举报
回复
补充: server端是windows server 2008 client端是winxp或者win8 server和client两端的windows的防火墙均已关闭。 运行server和client时,均使用Administrator管理员权限

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧