https://github.com/bakwc/udt-nat-traverse

Example of nat traversal using udt library. UDT is a udp based connection establishing protocol.

  • server.cpp - waiting for two clients, send them their addresses
  • client.cpp - connects to server, wait for other client address, connects to other client
#include <arpa/inet.h>
#include <udt.h>
#include <iostream>
#include <cstring> using namespace std; int main() {
UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, ); sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons();
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero), '\0', ); if (UDT::ERROR == UDT::bind(serv, (sockaddr*)&my_addr, sizeof(my_addr))) {
cout << "bind error: " << UDT::getlasterror().getErrorMessage();
return ;
} UDT::listen(serv, ); while(true) {
int namelen;
sockaddr_in recver1addr, recver2addr;
char ip[];
char data[];
cout << "waiting for connections\n"; UDTSOCKET recver1 = UDT::accept(serv, (sockaddr*)&recver1addr, &namelen);
cout << "new connection: " << inet_ntoa(recver1addr.sin_addr) << ":" << ntohs(recver1addr.sin_port) << endl; UDTSOCKET recver2 = UDT::accept(serv, (sockaddr*)&recver2addr, &namelen);
cout << "new connection: " << inet_ntoa(recver2addr.sin_addr) << ":" << ntohs(recver2addr.sin_port) << endl; cout << "sending addresses\n";
*(uint32_t*)data = recver2addr.sin_addr.s_addr;
*(uint16_t*)(data + ) = recver2addr.sin_port;
UDT::send(recver1, data, , ); *(uint32_t*)data = recver1addr.sin_addr.s_addr;
*(uint16_t*)(data + ) = recver1addr.sin_port;
UDT::send(recver2, data, , ); UDT::close(recver1);
UDT::close(recver2);
} UDT::close(serv); return ;
}
#include <iostream>
#include <udt.h>
#include <arpa/inet.h>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <unistd.h> using namespace std;
using namespace UDT; int main() {
UDTSOCKET client = UDT::socket(AF_INET, SOCK_STREAM, ); sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons();
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // server address here
memset(&(serv_addr.sin_zero), '\0', ); // selecting random local port
srand(time(NULL));
int myPort = + rand() % ;
printf("my port: %d\n", myPort); sockaddr_in my_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(myPort);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero), '\0', ); // Connecting to server // binding my port
if (UDT::ERROR == UDT::bind(client, (sockaddr*)&my_addr, sizeof(my_addr))) {
cout << "bind error: " << UDT::getlasterror().getErrorMessage();
return ;
} // connect to the server
if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr))) {
cout << "connect error: " << UDT::getlasterror().getErrorMessage();
return ;
} char data[];
if (UDT::ERROR == UDT::recv(client, data, , )) {
cout << "recv error:" << UDT::getlasterror().getErrorMessage() << endl;
return ;
} sockaddr_in peer_addr;
peer_addr.sin_family = AF_INET;
peer_addr.sin_addr.s_addr = *(uint32_t*)data;
peer_addr.sin_port = *(uint16_t*)(data + ); cout << "addr received: " << inet_ntoa(peer_addr.sin_addr) << ":" << ntohs(peer_addr.sin_port) << endl;
UDT::close(client); client = UDT::socket(AF_INET, SOCK_STREAM, );
bool rendezvous = true;
UDT::setsockopt(client, , UDT_RENDEZVOUS, &rendezvous, sizeof(bool)); if (UDT::ERROR == UDT::bind(client, (sockaddr*)&my_addr, sizeof(my_addr))) {
cout << "bind error: " << UDT::getlasterror().getErrorMessage();
return ;
} if (UDT::ERROR == UDT::connect(client, (sockaddr*)&peer_addr, sizeof(peer_addr))) {
cout << "connect error: " << UDT::getlasterror().getErrorMessage();
return ;
}
cout << "SUCCESS!\n";
sleep(); // give another client time to connect too return ;
}

udt nat traverse的更多相关文章

  1. UDT: Breaking the Data Transfer Bottleneck

    http://udt.sourceforge.net/ DT is a reliable UDP based application level data transport protocol for ...

  2. centos7 lvs+keepalived nat模式

    1.架构图   3.地址规划 主机名 内网ip 外网ip lvs-master 192.168.137.111(仅主机)eth1 172.16.76.111(桥接)eth0 lvs-slave 192 ...

  3. DHCP, NAT

    DHCP Dynamic Host Configuration Protocol(动态主机配置协议) (RFC 2131) Bootstrap Protocol BOOTP(引导程序协议) allow ...

  4. 高效实时的网络会议数据传输库—UDT

    在视频会议系统的研发当中,我们的音.视频数据必须要有相应的可靠性作为保障,因为视频会议系统是一个实时性非常强的系统,如果其数据在网络不太好的情况下,有可能会出现丢包.数据延迟.数据堵塞等现象,出现这些 ...

  5. 基于UDP高性能传输协议UDT doc翻译(一)

    原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd                  UDT文档阅读理解 一.  概述 ...

  6. 网络协议之:基于UDP的高速数据传输协议UDT

    目录 简介 UDT协议 UDT的缺点 总结 简介 简单就是美.在网络协议的世界中,TCP和UDP是建立在IP协议基础上的两个非常通用的协议.我们现在经常使用的HTTP协议就是建立在TCP协议的基础上的 ...

  7. 浅谈iptables 入站 出站以及NAT实例

    --------------本文是自己工作上的笔记总结,适合的可以直接拿去用,不适合的,适当修改即可!--------------- iptbales默认ACCEPT策略,也称通策略,这种情况下可以做 ...

  8. 解决VMWARE NAT SERVICE服务无法启动或服务消失的问题

    解决VMWARE NAT SERVICE服务无法启动或服务消失的问题 2016-02-02 11:18 2012人阅读 评论(2) 收藏 举报  分类: 网络通信(3)  今日使用VMware中的Wi ...

  9. linux 做gw(nat)详细配置

                          linux 做企业网关gw(nat)详细配置   最近因为公司的路由器老化导致上网时断时续,上半小时网就断一次网,为此我头疼不已,本着为公司节约成本的宗旨, ...

随机推荐

  1. html中的特殊符号

    html中的特殊符号 符号 说明 编码   符号 说明 编码   符号 说明 编码 " 双引号 " × 乘号 × ← 向左箭头 ← & AND符号 & ÷ 除号 ÷ ...

  2. org.hibernate.MappingException: duplicate import异常

    在开发hibernate时,一起多谢ORM类和映射文件时,报出:org.hibernate.MappingException: duplicate import com.XXX异常 解决方案: 检查你 ...

  3. android去掉EditView的默认焦点问题

    在EditText的父级控件中找一个,设置成 <LinearLayout android:layout_width="0dp" android:layout_height=& ...

  4. Linux makefile教程之条件判断六[转]

    使用条件判断 —————— 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支.条件表达式可以是比较变量的值,或是比较变量和常量的值. 一.示例 下面的例子,判断$(CC)变量是否“g ...

  5. hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)

    废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: ...

  6. 13、NFC技术:读写非NDEF格式的数据

    MifareUltralight数据格式 将NFC标签的存储区域分为16个页,每一个页可以存储4个字节,一个可存储64个字节(512位).页码从0开始(0至15).前4页(0至3)存储了NFC标签相关 ...

  7. java 多线程同步

    一.synchronized关键字 同步方法 每个对象都包含一把锁(也叫做监视器),它自动称为对象的一部分(不必为此写任何特殊的代码).调用任何synchronized方法时,对象就会被锁定,不可再调 ...

  8. iOS学习笔记之回调(二)

    写在前面 上一篇学习笔记中简单介绍了通过目标-动作对实现回调操作:创建两个对象timer和logger,将logger设置为timer的目标,timer定时调用logger的sayOuch函数.在这个 ...

  9. ListView真的蛮好用

    老规矩,今晚学过的,明天,依靠回忆写出来. 打个卡,占个版面.

  10. 黑马程序员——有关protocol代理模式的举例说明

    学习了protocol协议的基本原理和使用方法之后 ,下面就看一下在程序中是怎么体现这种代理思想的. 假定有个人jack需要找一个厨师为自己做饭,当他想要吃饭的时候就可以让厨师给他做好饭.这一需求如何 ...