2013-08-26 4 views
1

Я пишу приложение на Linux (клиент и сервер) с программированием сокетов. Я столкнулся с сценарием, когда мое серверное приложение никогда не отвечает на первоначальный пакет SYN другого конца.Принимает ли событие событие после трехстороннего рукопожатия?

Я все еще отлаживаю проблему.

Поскольку мой сервер прослушивает порт, он никогда не генерирует событие accept. Является ли событие accept генерируется после того, как рукопожатие TCP завершено ИЛИ событие accept генерируется при получении первоначального пакета SYN?

Некоторые полезные ссылки были бы полезны.

Лучшие

+1

Возможно, ваш прослушиваемый журнал заполняется? – ldx

+1

Какое конкретное поведение вы видите и каков ваш вопрос об этом поведении? – xaxxon

+0

@xaxxon .. Я не нахожу каких-либо событий принятия, сгенерированных, хотя tcpdump показывает, что пакет SYN достиг сервера на этом конкретном порту. Мой вопрос: Является ли событие accept не сгенерированным, потому что рукопожатие еще не закончилось? –

ответ

0

Accept() не совсем событие, а функция, которая инкапсулирует логику на стороне сервера для TCP рукопожатия. Функция вызывается заранее (ожидание клиентского соединения), и она возвращается после завершения рукопожатия (она получила ACK от клиента).

Некоторые подробные объяснения здесь: http://lwn.net/Articles/508865/ http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/

Какие ошибки вы получаете? Убедитесь, что ваш сервер доступен клиенту.

+1

Если вы используете select() и передаете fd сервера, то accept() будет запускаться как событие чтения. –

+0

Manoj, не означает ли это, что select() завершил трехстороннее рукопожатие, и поэтому клиент считает, что он связан, когда на самом деле он должен ждать явного «принятия» с сервера? Другими словами, разве это не означает «принять» избыточность? –

+0

@ManojPandey - это правильно. Ваш комментарий не имеет смысла. Ни accept(), ни select() не завершают рукопожатие. TCP делает это в ядре. Ваш ответ не передает этого, и он не может передать, что рукопожатие уже произошло, прежде чем accept() вызывается. – EJP

3

ли сгенерирован принять событие после того, как TCP квитирование делается

Да.

ИЛИ принимающее событие создается, когда принимается первоначальный пакет SYN?

Нет. Рукопожатие уже произошло. Метод accept() просто предоставляет вам сокет из очереди уже принятых соединений. Пока очередь пуста, она блокируется.

+0

Вы уверены, что системный вызов accept() произойдет после трехстороннего рукопожатия? Этот сайт говорит, что принятие системного вызова отвечает за генерацию SYN + ACK на стороне сервера во время рукопожатия https://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/#connect – Zephyr

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