c#udpClient发送的数据包不存在路由器

时间:2016-11-17 14:18:03

标签: c# c++ sockets networking

使用以下代码:

UdpClient Sender = new UdpClient();

        try
        {
            Sender.Send(Encoding.ASCII.GetBytes(msgOut), msgOut.Length, ip);
        }

我正在尝试将对先前请求的回复发送回同一个ip / port。 在同一台电脑上工作时 它只有在我自定义localhost的值时才会起作用,因为当我在NAT中声明我自己的计算机IP时它甚至都不起作用。

关于它的两个事实:

1)相同的ip / port值在我的c ++版本上运行得非常好。 (甚至在全球范围内)使用下一个代码:

sockaddr_in si_custom;
int s_custom;
//create socket
if ((s_custom = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
    //socket fail
    return false;
}

//setup address structure
memset((char *)&si_custom, 0, sizeof(si_custom));
si_custom.sin_family = AF_INET;
si_custom.sin_port = htons(stoi(port));
si_custom.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
//send the message
if (sendto(s, msg.c_str(), msg.size(), 0, (struct sockaddr *) &si_custom, slen) == SOCKET_ERROR)
{
    closesocket(s_custom);
    return false;
}
closesocket(s_custom);
return true;

2)在防火墙中启用靠近远程相关的任何东西后, 我的wireshark数据包嗅探器告诉我,我的数据包会让我的计算机完全正常。

我试图弄清楚,为什么c#udpClient类的行为与我的c ++ Udp代码不同,因为我的路由器拒绝通过第一个并同意通过后者。

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用我自己的Ip:port初始化UdpClient Sender对象解决了问题

UdpClient Sender = new UdpClient( new IPEndPoint(MyIP,MyPort));