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
  1. #include <arpa/inet.h>
  2. #include <udt.h>
  3. #include <iostream>
  4. #include <cstring>
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9. UDTSOCKET serv = UDT::socket(AF_INET, SOCK_STREAM, );
  10.  
  11. sockaddr_in my_addr;
  12. my_addr.sin_family = AF_INET;
  13. my_addr.sin_port = htons();
  14. my_addr.sin_addr.s_addr = INADDR_ANY;
  15. memset(&(my_addr.sin_zero), '\0', );
  16.  
  17. if (UDT::ERROR == UDT::bind(serv, (sockaddr*)&my_addr, sizeof(my_addr))) {
  18. cout << "bind error: " << UDT::getlasterror().getErrorMessage();
  19. return ;
  20. }
  21.  
  22. UDT::listen(serv, );
  23.  
  24. while(true) {
  25. int namelen;
  26. sockaddr_in recver1addr, recver2addr;
  27. char ip[];
  28. char data[];
  29. cout << "waiting for connections\n";
  30.  
  31. UDTSOCKET recver1 = UDT::accept(serv, (sockaddr*)&recver1addr, &namelen);
  32. cout << "new connection: " << inet_ntoa(recver1addr.sin_addr) << ":" << ntohs(recver1addr.sin_port) << endl;
  33.  
  34. UDTSOCKET recver2 = UDT::accept(serv, (sockaddr*)&recver2addr, &namelen);
  35. cout << "new connection: " << inet_ntoa(recver2addr.sin_addr) << ":" << ntohs(recver2addr.sin_port) << endl;
  36.  
  37. cout << "sending addresses\n";
  38. *(uint32_t*)data = recver2addr.sin_addr.s_addr;
  39. *(uint16_t*)(data + ) = recver2addr.sin_port;
  40. UDT::send(recver1, data, , );
  41.  
  42. *(uint32_t*)data = recver1addr.sin_addr.s_addr;
  43. *(uint16_t*)(data + ) = recver1addr.sin_port;
  44. UDT::send(recver2, data, , );
  45.  
  46. UDT::close(recver1);
  47. UDT::close(recver2);
  48. }
  49.  
  50. UDT::close(serv);
  51.  
  52. return ;
  53. }
  1. #include <iostream>
  2. #include <udt.h>
  3. #include <arpa/inet.h>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <cstdlib>
  7. #include <unistd.h>
  8.  
  9. using namespace std;
  10. using namespace UDT;
  11.  
  12. int main() {
  13. UDTSOCKET client = UDT::socket(AF_INET, SOCK_STREAM, );
  14.  
  15. sockaddr_in serv_addr;
  16. serv_addr.sin_family = AF_INET;
  17. serv_addr.sin_port = htons();
  18. inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // server address here
  19. memset(&(serv_addr.sin_zero), '\0', );
  20.  
  21. // selecting random local port
  22. srand(time(NULL));
  23. int myPort = + rand() % ;
  24. printf("my port: %d\n", myPort);
  25.  
  26. sockaddr_in my_addr;
  27. my_addr.sin_family = AF_INET;
  28. my_addr.sin_port = htons(myPort);
  29. my_addr.sin_addr.s_addr = INADDR_ANY;
  30. memset(&(my_addr.sin_zero), '\0', );
  31.  
  32. // Connecting to server
  33.  
  34. // binding my port
  35. if (UDT::ERROR == UDT::bind(client, (sockaddr*)&my_addr, sizeof(my_addr))) {
  36. cout << "bind error: " << UDT::getlasterror().getErrorMessage();
  37. return ;
  38. }
  39.  
  40. // connect to the server
  41. if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr))) {
  42. cout << "connect error: " << UDT::getlasterror().getErrorMessage();
  43. return ;
  44. }
  45.  
  46. char data[];
  47. if (UDT::ERROR == UDT::recv(client, data, , )) {
  48. cout << "recv error:" << UDT::getlasterror().getErrorMessage() << endl;
  49. return ;
  50. }
  51.  
  52. sockaddr_in peer_addr;
  53. peer_addr.sin_family = AF_INET;
  54. peer_addr.sin_addr.s_addr = *(uint32_t*)data;
  55. peer_addr.sin_port = *(uint16_t*)(data + );
  56.  
  57. cout << "addr received: " << inet_ntoa(peer_addr.sin_addr) << ":" << ntohs(peer_addr.sin_port) << endl;
  58. UDT::close(client);
  59.  
  60. client = UDT::socket(AF_INET, SOCK_STREAM, );
  61. bool rendezvous = true;
  62. UDT::setsockopt(client, , UDT_RENDEZVOUS, &rendezvous, sizeof(bool));
  63.  
  64. if (UDT::ERROR == UDT::bind(client, (sockaddr*)&my_addr, sizeof(my_addr))) {
  65. cout << "bind error: " << UDT::getlasterror().getErrorMessage();
  66. return ;
  67. }
  68.  
  69. if (UDT::ERROR == UDT::connect(client, (sockaddr*)&peer_addr, sizeof(peer_addr))) {
  70. cout << "connect error: " << UDT::getlasterror().getErrorMessage();
  71. return ;
  72. }
  73. cout << "SUCCESS!\n";
  74. sleep(); // give another client time to connect too
  75.  
  76. return ;
  77. }

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. Creole

    Home           Bisher besucht:    AnzeigenAnhängeInfo           The Creole 1.0 project has been succ ...

  2. Ubuntu 下安装 使用 QQ

    在Ubuntu下使用QQ显得高端大气了.界面也清爽多了. 一: 首先得下一个WineQQ,不用找了地址在这里: http://pan.baidu.com/share/link?shareid=3303 ...

  3. DDoS攻防战(二):CC攻击工具实现与防御理论

    我们将要实现一个进行应用层DDoS攻击的工具,综合考虑,CC攻击方式是最佳选择,并用bash shell脚本来快速实现并验证这一工具,并在最后,讨论如何防御来自应用层的DDoS攻击. 第一步:获取大量 ...

  4. AngularJs学习教程

    AngularJs 目录 AngularJs实战一 购物车 细讲ng-repeat指令 ng-show和ng-hide ng-class指令 ng-src和ng-href 应用控制器中的职责 watc ...

  5. ansible控制windows的官方翻译

    Ansible控制windows 1.    Windows下如何工作 在ansible控制linux的时候,用的是ssh的方式,在windows中,使用的是power shell,在客户端机器上也是 ...

  6. strtol()函数

    #include <stdlib.h>#include <stdio.h> int main(){ char a[] = "100"; char b[] = ...

  7. PHPCMS V9实现硬件地址MAC绑定访问技术实现

    目的:会员登录需要 用户名.密码.身份识别码(新增字段) 效果:  解决方法: 目前数据库中macaddress字段已经添加,修改了phpcms\modules\member\index.php 63 ...

  8. WS之cxf与spring整合1

    1.在web.xml中加入CXFServlet: <!-- 下面表示所有来自/cxfservice/*的请求,都交给 CXFServlet来处理 .--> <servlet>  ...

  9. TortoiseGit's Settings

    将鼠标停放在Settings-TortoiseGit窗体上的editbox,checkbox上,有些会弹出有用的提示信息. 2.35.1. General settings: 设定自己偏好的语言,Gi ...

  10. HW7.13

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...