为位于不同网络中的节点定义UDP套接字
作者:互联网
假设有两个位于两个不同网络中的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,还需要编辑哪些内容,以便从node1到node2的UDP数据包可以毫无问题地传递?
#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的专用地址.
标签:sockets,network-programming,udp,c-3,linux 来源: https://codeday.me/bug/20191123/2065589.html