Как проверить пакет ACK с функцией записи в TCP-клиенте? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь написать TCP-клиент с функцией записи , следующим образом: guide .

Я закрыл сеть и попытался отправить пакет PING с 2 байтами данных.

Поскольку это TCP-клиент, я ожидаю, что возвращается какая-то ошибка, потому что сеть вообще не существует, и сервер не сможет получить сообщение, следовательно, пакет ACK не будет возвращен. Однако функция записи возвращает записанные 2 байта, похоже, что она вообще не проверяет ACK-пакет со стороны сервера.

Как я могу проверить ACK , чтобы убедиться, что мое сообщение успешно отправлено и сервер его получил?

1 Ответ

1 голос
/ 30 мая 2019

Если вы запустите клиент и сервер на одной и той же машине, они будут взаимодействовать через интерфейс обратной связи, поэтому отключение или отключение интерфейса исходящей сети ничего не изменит. Ваш сервер и клиент счастливо общаются друг с другом. Если действительно нет никакого соединения между сервером и клиентом, connect() должен был произойти сбой с errno, установленным в ENETUNREACH или ECONNREFUSED, если сервер отказывает в соединении. Так что вы, вероятно, хотите, чтобы клиент работал на вашем компьютере, а сервер - на другом компьютере или в виртуальной машине с мостовой сетью. Обратите внимание, что write() успешный возврат означает только то, что байты буферизируются для отправки. Он может даже вернуть меньше байтов, чем содержится в вашем сообщении, указывая на то, что буфер в настоящее время заполнен, и вам нужно попытаться отправить оставшиеся байты позже.

Лучший способ проанализировать реализации протокола - это использовать инструмент, такой как wireshark, чтобы увидеть, какие пакеты действительно отправляются по проводам (или через интерфейс обратной связи).

...