Это действительно сводится к тому, что вы подразумеваете под «пакетом».
Как вы, вероятно, знаете, при отправке сообщения TCP / UDP по проводной линии отправляемые данные «переносятся» или добавляются с соответствующим заголовком TCP / UDP. Затем он «оборачивается» в заголовок IP, который, в свою очередь, «оборачивается» в кадр Ethernet. Вы можете увидеть этот прорыв, если вы используете пакет сниффинга, такой как Wireshark.
Дело в том. Когда я слышу термин «пакет», я думаю о данных на уровне IP. IP-данные действительно упакованы по проводам, поэтому подсчет пакетов имеет смысл, когда речь идет об IP. Однако, если вы используете обычные сокеты для отправки и получения ваших данных, заголовки IP, а также заголовки TCP / UDP удаляются, то есть вы не получаете эту информацию из сокета. А без этой информации невозможно определить количество «пакетов» (опять же, я думаю, IP), которые были переданы.
Вы можете сделать то, что предлагают другие, добавив свой собственный заголовок с длиной и счетчиком. Эта информация поможет вам точно определить размер ваших приемных буферов, но не поможет вам определить количество пакетов (опять же, IP ...), особенно если вы используете TCP.
Если вы хотите точно определить количество пакетов с использованием сокетов Winsock, я бы предложил создать «сырой» сокет, как предложено здесь . Этот сокет будет собирать весь IP-трафик, видимый вашей локальной сетевой картой. Используйте заголовки IP и TCP / UDP для фильтрации данных на основе сокетов вашего клиента и сервера, то есть IP-адресов и номеров портов. Это даст точную картину того, сколько IP-пакетов было фактически использовано для передачи ваших данных.