c - 为位于不同网络的节点定义 UDP 套接字

标签 c linux sockets network-programming 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 以及还有什么我需要编辑以便 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/

相关文章:

c - 柯尔莫哥洛夫斯米尔诺夫检验

c - UDP 多播未收到消息

c - 当我在 linux 下的 c 套接字中使用 read() 和 write() 时尺寸缩小

c++ - QSocketNotifier : Socket notifiers cannot be enabled or disabled from another thread

c - ld 搜索格式错误的目录路径

c - 正常 block 后检测到堆损坏(#55)

linux - 一个单词一个单词地搜索整行

python - 在 python 中使用 notify-send 显示多行通知

创建 mpi 派生数据类型,包含带指针的结构

c - Linux 的 GCC 替代方案,支持 OpenMP 和带 +、-、*、/和 % 的 128 位整数