【问题标题】:UDP "sendto" outside the local network本地网络外的 UDP“发送到”
【发布时间】:2013-11-05 16:50:26
【问题描述】:

您好,我最近开始编写 UDP 套接字,并且一直在将它们用于本地网络上的各种东西。但我似乎找不到任何关于如何在我可爱的防火墙之外发送 UDP 数据包的信息。

这是我用来绑定 UDP 套接字的代码

int handle = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( (unsigned short) /* port */);
bind( handle, (const sockaddr*) &address, sizeof(sockaddr_in) )

这是我用来发送数据包的代码

sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl( /*local network IP Address*/ );
address.sin_port = htons( (unsigned short) /* port */ );

sendto( handle, (const char*)/* packet data */, size, 0, (sockaddr*)&address, sizeof(sockaddr_in) );

最后是我用来接收数据包的代码

sockaddr_in from;
socklen_t fromLength = sizeof( from );

int received_bytes = recvfrom( handle, (char*)data, size, 0, (sockaddr*)&from, &fromLength );

【问题讨论】:

  • 问题很可能是 服务器 端的防火墙。使用 netcat 的 UDP 流量可以正常工作吗?如果没有,首先修复防火墙(在家庭路由器上,您必须在服务器端配置端口转发,甚至在您的应用程序中使用精心设计的NAT traversal 方案)。

标签: c sockets networking udp sendto


【解决方案1】:

好吧,由于 UDP 是一种“未连接”的发送数据方式,您必须向路由器的防火墙添加规则,以便路由端口(到应该接收数据的计算机)。

问题不在于代码,而在于网络基础设施。

【讨论】:

  • 您无需提供 ISP IP 或其他任何东西就可以在接收器开启的情况下找到本地网络?
  • beej.us/guide/bgnet/output/html/multipage/faq.html 这个页面有一小部分关于你是否在防火墙后面,这有助于回答我的问题。
猜你喜欢
  • 2017-08-21
  • 2018-07-22
  • 2015-02-19
  • 2015-03-25
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 2014-12-24
  • 2023-01-30
相关资源
最近更新 更多