ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-23 06:51:55  阅读:253  来源: 互联网

标签:sockets network-programming udp c-3 linux


假设有两个位于两个不同网络中的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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有