Связать существующий сокет с UDT

Я использую библиотеку UDT для передачи файлов между компьютерами за NAT. Я уже сделал протокол дырокола в Python, и я знаю, как он работает. Здесь я пытаюсь привязать сокет UDT к существующему сокету UDP.

int udt_holepunching(SOCKET sock, SOCKADDR_IN sin, int size, SOCKADDR_IN peeraddr)
    {
      UDTSOCKET u;
      bool rdv = true;



      UDT::setsockopt(u, 0, UDT_RENDEZVOUS, &rdv, sizeof(bool));
      UDT::bind(u, sock);
      UDT::connect(u, &peeraddr, sizeof(peeraddr));
    }

с sock мой существующий сокет UDP и peeraddr адрес компьютера, с которым я хочу поговорить

у меня есть эта ошибка:

client.cpp: In function ‘int udt_holepunching(SOCKET, SOCKADDR_IN, int, SOCKADDR_IN)’:
client.cpp:29:20: error: invalid conversion from ‘SOCKET {aka int}’ to ‘const sockaddr*’ [-fpermissive]
   UDT::bind(u, sock);
                    ^
client.cpp:29:20: error: too few arguments to function ‘int UDT::bind(UDTSOCKET, const sockaddr*, int)’
In file included from client.cpp:13:0:
../src/udt.h:315:13: note: declared here
 UDT_API int bind(UDTSOCKET u, const struct sockaddr* name, int namelen);

Это немного странно, потому что в документации по привязке UDT это представляется возможным.

2 ответа

Решение

Ссылка на ссылку показывает две перегрузки. Компилятор выбирает первый (перегрузка аргумента дерева), потому что вы передаете UDTSOCKET в качестве первого аргумента и иметь второй аргумент.

Поскольку второй аргумент в перегрузке с тремя аргументами не является SOCKET Вы получаете первую ошибку. И так как вы передаете только два аргумента функции, ожидающей три, вы получите вторую ошибку.

Если вы хотите привязать к определенному адресу (скажем, sin аргумент, который вы передаете своей функции), тогда вам нужно передать указатель на эту структуру адреса в качестве второго аргумента и размер этой структуры в качестве третьего аргумента:

UDT::bind(u, (const SOCKADDR*) &sin, sizeof(sin));

Если вы хотите использовать вторую перегрузку, используйте ее:

UDT::bind(sock);

Вы не можете смешивать и сочетать, как вам нравится, вы должны выбрать один или другой.

Технический ответ скрыт в комментариях выше: Используйте

      bind2(udtsocket, udpsocket)

на созданных сокетах UDT / UDP.

Что касается пробивки отверстий, это может быть сделано вообще без учета UDP, см. пробивки отверстий ШаблонUDT. Это также показывает допустимое использование опции RENDEVOUS.

Другие вопросы по тегам