其他分享
首页 > 其他分享> > 为位于不同网络中的节点定义UDP套接字

为位于不同网络中的节点定义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