2012-05-18 3 views
0

Я смотрю на блокирующий вызов send() и смотрю, есть ли способ измерить время, проведенное в функции, чтобы быть в состоянии узнать, какое событие произошло за это время, чтобы можно было провести качественный анализ скорости соединения и т. Д.На каком уровне сетевой модели (например, OSI) возвращается Winsock2.h?

При этом одно из первых, что нужно знать, - это то, на каком слое функция возвращает успех.

ответ

0

send() API собирается вернуть успех почти сразу IFF имеется достаточное буферное пространство доступно для хранения данных и таблица маршрутизации по-прежнему показывает путь к маршрутизации пакета к партнеру. (На самом деле у есть, чтобы иметь возможность связаться со сверстниками - просто, чтобы машина имела следующий доступный переход ...) Если ему нужно дождаться освобождения буферного пространства, это произойдет. (Наблюдение данных ACKed или передача на проводе должно быть легким с Wireshark.)

Кстати, уровни OSI несовершенно применяются к семействам протоколов TCP/IP; слои 1 и 2 подходят очень близко, слой 3 - примерно IP-маршрутизация, уровень 4 - примерно TCP, UDP, SCTP, ICMP и т. д. Но слои 5, 6, 7 не имеют реальных аналогов - SMTP через TLS можно считать слоем 7 или, возможно, SMTP - это уровень 7, а TLS - это слой 6 ... все это очень быстро становится нечетким.

Просто поговорить о конкретном уровне в стеке протоколов TCP/IP, о котором вам интересно. send() работает с потоком, дейтаграммой и сырыми сокетами, поэтому он может оседлать несколько слоев стека - вы можете использовать его для отправки TCP, UDP, SCTP или ICMP-пакетов или набросать прямо на провод, если хотите.

Смежные вопросы