2009-06-18 2 views
4

Я занимаюсь программированием сокетов в течение многих лет, но до сих пор у меня никогда не было пропущенного сообщения, использующего TCP. У меня есть Java-сервер и клиент в C - как на локальном хосте. Они отправляют короткие сообщения взад и вперед как строки, с некоторыми задержками между ними. У меня есть один частный случай, когда сообщение никогда не появляется на стороне клиента. Это воспроизводимо, но странно зависит от машины.Пропущенное сообщение сокета

Чтобы предоставить более подробную информацию, я могу отлаживать серверную сторону и видеть отправку, сопровождаемую флешем. Я могу подключиться к клиенту и пройти через выбранные вызовы (в цикле), но он просто не появляется. Кто-нибудь испытал это и есть объяснение, отличное от ошибки кодирования?

Другими словами, если у вас есть подключенный сокет и пишите на одной стороне, а читайте на другом, что может произойти посередине, чтобы вызвать что-то подобное?

Еще одна деталь - я использовал tcpdump на интерфейсе loopback и вижу пропущенное сообщение.

+0

Является ли ваш клиент многопоточным? Возможно ли, что отдельный поток также выбирает() для этого сообщения? Кроме того, какую ОС вы используете? –

+0

Я не думаю, что его можно выбрать для другого потока. Это на Linux. Хорошая идея, хотя - я проверил счетчик. – AdamC

ответ

1

И наконец - после того, как понюхал еще несколько, я нашел проблему. Два сообщения отправлялись перед чтением (иногда, но редко ...), поэтому они оба читались, но обрабатывались только первые. Вот почему казалось, что второе сообщение так и не появилось. Он был похоронен в буфере приема.

+1

qrdl отлично подходит. UDP гарантирует 1 запись == 1, но TCP явно не (чтобы обеспечить лучшую пропускную способность). –

+0

Хорошая точка в управлении потоком - это отличный способ предотвратить такую ​​ошибку, но вызов bs по моему опыту является грубым. Я почти не опубликовал ответ, так как это была такая глупая ошибка именно по этой причине, но я хотел, чтобы кто-то еще видел эту идею, где искать. – AdamC

4

Я видел это в SMTP-транзакциях раньше. У вас на компьютере установлен антивирус? Если да, попробуйте отключить его и посмотрите, не изменилось ли это.

В противном случае я предлагаю установить Wireshark, чтобы вы могли посмотреть, что на самом деле происходит.

+0

Он использовал tcpdump и увидел недостающее сообщение. Wireshark дает более подробную информацию, но не будет иметь большого значения. – bortzmeyer

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