udt nat traverse
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的更多相关文章
- UDT: Breaking the Data Transfer Bottleneck
http://udt.sourceforge.net/ DT is a reliable UDP based application level data transport protocol for ...
- centos7 lvs+keepalived nat模式
1.架构图 3.地址规划 主机名 内网ip 外网ip lvs-master 192.168.137.111(仅主机)eth1 172.16.76.111(桥接)eth0 lvs-slave 192 ...
- DHCP, NAT
DHCP Dynamic Host Configuration Protocol(动态主机配置协议) (RFC 2131) Bootstrap Protocol BOOTP(引导程序协议) allow ...
- 高效实时的网络会议数据传输库—UDT
在视频会议系统的研发当中,我们的音.视频数据必须要有相应的可靠性作为保障,因为视频会议系统是一个实时性非常强的系统,如果其数据在网络不太好的情况下,有可能会出现丢包.数据延迟.数据堵塞等现象,出现这些 ...
- 基于UDP高性能传输协议UDT doc翻译(一)
原文转自:http://hi.baidu.com/doodlezone/item/74a203155efe26dbbf9042dd UDT文档阅读理解 一. 概述 ...
- 网络协议之:基于UDP的高速数据传输协议UDT
目录 简介 UDT协议 UDT的缺点 总结 简介 简单就是美.在网络协议的世界中,TCP和UDP是建立在IP协议基础上的两个非常通用的协议.我们现在经常使用的HTTP协议就是建立在TCP协议的基础上的 ...
- 浅谈iptables 入站 出站以及NAT实例
--------------本文是自己工作上的笔记总结,适合的可以直接拿去用,不适合的,适当修改即可!--------------- iptbales默认ACCEPT策略,也称通策略,这种情况下可以做 ...
- 解决VMWARE NAT SERVICE服务无法启动或服务消失的问题
解决VMWARE NAT SERVICE服务无法启动或服务消失的问题 2016-02-02 11:18 2012人阅读 评论(2) 收藏 举报 分类: 网络通信(3) 今日使用VMware中的Wi ...
- linux 做gw(nat)详细配置
linux 做企业网关gw(nat)详细配置 最近因为公司的路由器老化导致上网时断时续,上半小时网就断一次网,为此我头疼不已,本着为公司节约成本的宗旨, ...
随机推荐
- Creole
Home Bisher besucht: AnzeigenAnhängeInfo The Creole 1.0 project has been succ ...
- Ubuntu 下安装 使用 QQ
在Ubuntu下使用QQ显得高端大气了.界面也清爽多了. 一: 首先得下一个WineQQ,不用找了地址在这里: http://pan.baidu.com/share/link?shareid=3303 ...
- DDoS攻防战(二):CC攻击工具实现与防御理论
我们将要实现一个进行应用层DDoS攻击的工具,综合考虑,CC攻击方式是最佳选择,并用bash shell脚本来快速实现并验证这一工具,并在最后,讨论如何防御来自应用层的DDoS攻击. 第一步:获取大量 ...
- AngularJs学习教程
AngularJs 目录 AngularJs实战一 购物车 细讲ng-repeat指令 ng-show和ng-hide ng-class指令 ng-src和ng-href 应用控制器中的职责 watc ...
- ansible控制windows的官方翻译
Ansible控制windows 1. Windows下如何工作 在ansible控制linux的时候,用的是ssh的方式,在windows中,使用的是power shell,在客户端机器上也是 ...
- strtol()函数
#include <stdlib.h>#include <stdio.h> int main(){ char a[] = "100"; char b[] = ...
- PHPCMS V9实现硬件地址MAC绑定访问技术实现
目的:会员登录需要 用户名.密码.身份识别码(新增字段) 效果: 解决方法: 目前数据库中macaddress字段已经添加,修改了phpcms\modules\member\index.php 63 ...
- WS之cxf与spring整合1
1.在web.xml中加入CXFServlet: <!-- 下面表示所有来自/cxfservice/*的请求,都交给 CXFServlet来处理 .--> <servlet> ...
- TortoiseGit's Settings
将鼠标停放在Settings-TortoiseGit窗体上的editbox,checkbox上,有些会弹出有用的提示信息. 2.35.1. General settings: 设定自己偏好的语言,Gi ...
- HW7.13
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...