Задержка перед передающим сообщением по сокету - как это помогает?

У меня есть интерфейс сокета tcpip к приложению внешнего программного обеспечения. Я реализовал этот интерфейс для нескольких сайтов для клиентов без проблемы. Последний клиент, хотя... проблемы. Мы включили вход в систему приложений на любом конце и также установили Wireshark на ПК для входа сырых данных tcpip трафик. С этим мы доказали, что мое приложение для сервера успешно отсылает сообщение, ПК получает сообщение, но клиентское приложение не видит его. (Это - полностью неустойчивая проблема, которая является, почему это - такая боль для поиска и устранения неисправностей.)

Детали сокета так просты, как они прибывают: один сокет, обрабатывающий двусторонние связи между сервером и ПК. Сообщения являются простым текстом ASCII и довольно короткий (не XML). Сервер инициирует связь путем отправки первого сообщения, и затем клиент отвечает несколькими сообщениями. Сокет сохранен открытым в любом случае, в то время как приложения работают. Клиентское приложение разработано так, чтобы конечный пользователь мог только обработать один случай за один раз, который предотвращает коллизии сообщения. У них есть своего рода настроенный опрос, их приложение "в спящем режиме", пока это не видит, что инициирование обменивается сообщениями с сервера.

Сторонний поставщик советовал мне добавлять некоторых вторая задержка, прежде чем я отправлю им сообщение инициирования. Я не вижу, как это помогает. Если клиент "спит", просто опросив сокет, ожидающий сообщения, как делает добавление задержки перед первой справкой сообщения? Это не похоже, мы отправляем два сообщения, и второй теряется. Это теряет первое сообщение. Таким образом, я не вижу, как имеет значение, если мы отправляем то сообщение теперь или две секунды с этого времени.

Я спросил их, и они не предоставили мне подробную информацию. Это могли быть некоторые собственные детали в их кодировании, которое они не хотят раскрывать мне, и это справедливо. Таким образом, я спрашиваю здесь, потому что я всегда изучаю новые вещи о программировании сокета. Возможно, Вы, парни могут пролить некоторый свет на то, как опрос сокета tcpip может быть затронут синхронизацией сообщения?

1
задан Carrie Cobol 30 June 2010 в 17:15
поделиться

1 ответ

Поскольку это чужой клиент, и они не скажут вам, что он делает (кроме слов «вставьте задержку»), ответ, вероятно, заключается в том, что их клиент читает и отбрасывает сообщение, потому что он еще не в состоянии Смирись с этим. Задержка позволит клиенту вовремя перейти в состояние, в котором он сможет правильно ответить на сообщение.

Другими словами, клиент находится в состоянии гонки. Это может произойти одним простым способом: если у них есть одна ветка для чтения сообщений, а другая - для работы с ними.

За исключением запуска strace (1) на клиенте, чтобы увидеть, какие системные вызовы он выполняет, трудно сказать, что на самом деле делает клиент.

2
ответ дан 2 September 2019 в 23:23
поделиться