Осмотр стандартного контейнера (станд.:: карта) содержание с gdb

Связность P2P в двух словах. Предположим, мы говорим о UDP здесь. Следующие шаги также могут применяться к TCP с некоторыми настройками.

  1. Перечислите все локальные IP-адреса (обычно только 1). Создайте сокет UDP для определенного номера порта ** для каждого адаптера с IP-адресом.
  2. Для каждого сокета, созданного на шаге 1, обратитесь к серверу STUN или TURN с тем же сокетом, чтобы обнаружить внешний IP-адрес и узнать, что внутренний номер порта отображает вне NAT (это не всегда одно и то же значение порта). То есть ваш локальный адрес 192.168.1.2:4900 может быть 128.11.12.13:8888 внешнему миру. И некоторые NAT не всегда используют одно и то же сопоставление портов при использовании одного и того же локального порта для других IP-адресов. TURN также предоставит вам «адрес реле». Вы также можете использовать UPNP для получения адреса, сопоставленного портам, с вашего маршрутизатора, если он поддерживает этот протокол.
  3. Через службу рандеву (SIP, XMPP, мгновенное сообщение, веб-сервис, электронная почта, чашки со строками) , опубликуйте свой список кандидатов на адрес в службу или отправьте уведомление другому клиенту, который говорит: «Эй, я хочу связаться с вами». Это сообщение включает в себя все «адресаты кандидатов» (пары ip и портов), собранные в шагах 1 и 2.
  4. Удаленный клиент, получив приглашение для подключения, также выполняет шаги 1 и 2 выше. Затем отправляет свой список кандидатов по тому же каналу, на который он получил список кандидатов приглашения.
  5. Шаг штамповки отверстий. Оба клиента начинают отправлять тестовые сообщения через UDP другим кандидатам на адреса других сторон и прослушивать одни и те же сообщения на своем конце. Всякий раз, когда принимаются сообщения, возвращайте обратно адрес, с которого он пришел. В конце концов, клиенты обнаружат, что у них есть пара адресов, которые они могут надежно отправлять дейтаграммы. Как правило, одна конечная точка принимает окончательное решение о том, по какой адресу (сокетам) адреса связывается, и протокол облегчает эту конечную точку, сообщая другой конечной точке это решение.

** - обычно лучше всего не делать этого полагаться на хорошо известный порт для клиентов P2P. Поскольку два клиента за одним и тем же NAT или брандмауэром вряд ли смогут использовать ваше программное обеспечение в то же время.

Ниже приведен краткий обзор некоторых технологий для изучения.

STUN - простой сервер и протокол для клиентов за NAT / маршрутом, чтобы узнать, каковы их внешние сопоставления IP и портов.

TURN - это расширение для STUN, но поддерживает ретрансляцию для сценариев подключения P2P, где брандмауэры и NAT предотвращают прямые подключения.

ICE - это набор шагов, с помощью которых STUN и TURN используются для настройки соединения P2P , ICE является формальным протоколом для шагов 1-5 выше. Два превосходных набора слайдов на ICE здесь здесь и здесь .

WebRTC является вариантом стандарта ICE в качестве справочной библиотеки для создания сеансов P2P с помощью STUN и TURN.

UPNP + Протокол интернет-шлюза - Некоторые маршрутизаторы поддерживают это для хостов для автоматического получения сопоставлений портов.

libnice - это библиотека C с открытым исходным кодом для Linux (и может работать на Windows), которая реализует ICE.

libjingle - еще одна реализация ICE ( в C ++) из Google. Для Windows и Linux.

PJNATH - это библиотека в наборе библиотек кодирования PJSIP . Это хорошая реализация стека ICE (код C) и была перенесена на множество платформ. (Windows, Linux, Mac, iOS, Symbian и вскоре Android).

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

83
задан Paolo Tedesco 12 January 2009 в 09:21
поделиться

4 ответа

Я думаю, что нет, по крайней мере, не, если Ваш источник оптимизирован и т.д. Однако существуют некоторые макросы для gdb, который может осмотреть контейнеры STL для Вас:

http://sourceware.org/ml/gdb/2008-02/msg00064.html

Однако я не использую это, таким образом, YMMV

32
ответ дан jpalecek 5 November 2019 в 16:36
поделиться

Эти stl-views.gdb раньше был лучшим ответом было, но не больше.

Это еще не интегрируется в магистраль GDB, но здесь - то, что Вы получаете использование ответвления 'archer-tromey-python' :

(gdb) list
1   #include <map>
2   int main(){
3       std::map<int,int> m;
4       m[1] = 2;
5       m[2] = 4;
6       return 0;
7   }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run

Breakpoint 1, main () at map.cc:6
6       return 0;
(gdb) print m
$1 = std::map with 2 elements = {
  [1] = 2,
  [2] = 4
}
(gdb) quit
20
ответ дан Employed Russian 5 November 2019 в 16:36
поделиться

Всегда существует очевидное: Определите свою собственную тестовую функцию... Назовите его от gdb. Например:

#define SHOW(X) cout << # X " = " << (X) << endl

void testPrint( map<int,int> & m, int i )
{
  SHOW( m[i] );
  SHOW( m.find(i)->first );
}

int
main()
{
    std::map<int,int> m;
    m[1] = 2;
    m[2] = 4;
    return 0;  // Line 15.
}

И:

....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD 

Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb) 
22
ответ дан Mr.Ree 5 November 2019 в 16:36
поделиться

Попытайтесь Разыменовать Контейнеры STL: на этой странице: http://www.yolinux.com/TUTORIALS/GDB-Commands.html

12
ответ дан anand 5 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: