Теоретически; да. Нет никакого способа дать 100% -ную теоретическую гарантию того, что то, что отправлено на аппаратном уровне, получено таким же образом на принимающей стороне.
Практически, однако, если вы используете TCP (Transmission Control Protocol), об этом уже позаботились; Вы не потеряете ни одного пакета. (Если вы используете UDP с другой стороны (протокол пользовательских дейтаграмм), это другая история, и вполне вероятно, что вы теряете пакеты или получаете их не по порядку).
Просто кратко посмотрел на ваш код, и кажется, что вы используете несколько потоков. Если это так, вы должны быть очень осторожны с синхронизацией. Вполне может случиться так, что похоже, что пакет был отброшен, хотя он просто не обрабатывается из-за состояния гонки в программе. (Имейте в виду, что графический интерфейс, например, работает в своем собственном потоке.)
Лучший способ решить синхронизацию, я думаю, это поместить сетевой цикл в очень маленький цикл чтения / установки на синхронизированную очередь и отбирать полученные пакеты из очереди, когда вы уверены, что нет другая нить вмешается.