Java Serversocket.accept () не возвращает сокет в последовательности подключения от клиента?

Мы создаем 2 соединения между сервером Java и клиентом C ++. Объект Java ServerSocket вызывает accept () дважды, и каждый возвращает 1 сокет; клиент C ++ дважды вызывает connect (). Мы предполагаем, что порт 1-го сокета, возвращаемый функцией accept (), должен быть таким же, как порт первого клиентского сокета, вызывающего connect (), и таким же для сокетов 2-й пары.

Но, исследуя номер порта на каждом сокете, я иногда видел ненормальный случай, когда 1-й сокет из accept () подключается ко 2-му клиентскому сокету, вызывающему connect (), а 2-й сокет из accept () подключается к 1-му клиентскому сокету. .

И сервер, и клиент здесь однопоточные для установления соединения. Как можно изменить последовательность?


person Kevin    schedule 26.06.2014    source источник


Ответы (2)


Порядок пакетов начальной синхронизации от двух соединений может быть изменен в сети. Например, если начальный SYN-пакет «первого» соединения отброшен и этот пакет не будет повторно отправлен до тех пор, пока не будет отправлен начальный SYN-пакет «второго» соединения. Кроме того, даже если ваш сервер и ваш клиент являются однопоточными, системный код, обрабатывающий стек TCP, может быть многопоточным.

person Warren Dew    schedule 26.06.2014
comment
Я предполагал, что рукопожатие выполняется до возврата connect (), поэтому обработка отброшенного SYN и повторной отправки должна завершиться до возврата connect (). - person Kevin; 28.06.2014

Вы не знаете, какова была «последовательность подключения от клиента». Соединение представляет собой трехстороннее рукопожатие с повторными попытками пакета. Последовательность в очереди невыполненных работ будет последовательностью получения окончательного ACK, о котором вы ничего не знаете.

person user207421    schedule 27.06.2014
comment
Может ли окончательный ACK вернуться после connect ()? В противном случае последовательность финальных ACK должна быть такой же, как последовательность connect (). - person Kevin; 28.06.2014
comment
Последний ACK отправляется от клиента к серверу; клиент даже не знает, когда он получен. - person Warren Dew; 28.06.2014