假设有两台位于两个不同网络中的 linux 机器具有以下配置
Node1 Node2
IPaddr(private) 192.168.0.14 10.25.3.75
Router modem's IP(real) 1.2.3.4 5.6.7.8
Netmask (real) 255.255.0.0 255.255.192.0
Router modem's IP(priv) 192.168.0.1 10.0.20.1
Netmask (priv) 255.255.255.0 255.0.0.0
以下是C
中的通用UDP(客户端)套接字代码(不包括错误检查以节省问题空间)。假设以下可以在 node1
上运行。我的问题是,如何我需要在下面的代码中定义 node2
以及还有什么我需要编辑以便 UDP 数据包来自node1 到 node2
会毫无问题地交付吗?
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define SRV_IP "5.6.7.8"
int main(){
struct sockaddr_in serv_addr;
int sockfd, i, slen=sizeof(serv_addr);
char buf[512] = "hello";
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(1234);
inet_aton(SRV_IP, &serv_addr.sin_addr);
sendto(sockfd, buf, BUFLEN, 0, (struct sockaddr*)&serv_addr, slen);
close(sockfd);
return 0;
}
我假设 UDP 服务器部分(在 node2
上)是通用代码,不需要任何特定修改即可从 node1
接收数据包,对吗?
最佳答案
路由 UDP 数据包(以及 TCP)不是您应该在代码中解决的任务,它是由路由器执行的。你应该编写你的代码,就好像客户端和服务器都在同一个网络上(你当前的代码看起来没问题),但是你还应该设置你的路由器,以便它们:1)允许通过 NAT 路由 UDP,以及 2)路由器Node2 (5.6.7.8) 必须将端口 1234 的 UDP 流量转发到 Node2 的私有(private)地址。
关于c - 为位于不同网络的节点定义 UDP 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17052058/