Вы могли бы сделать ...
#define replace replacement
#define to here
Следите за непреднамеренными побочными эффектами определений. Вероятно, вы захотите #undef
их после того, как они выполнили свою работу.
Стороной, которая была инициирована закрытие соединения, является та, которая заканчивается в состоянии TIME_WAIT
. read()
возврат 0 должен указывать на то, что сервер сначала закрыл сокет, так что да - это должно означать, что TIME_WAIT
заканчивается на стороне сервера, а клиент проходит через LAST_ACK
.
В конце дня вы не можете избежать состояния TIME_WAIT
. Даже если вам удастся перенести его с сервера на сервер, вы все равно не сможете повторно использовать этот кортеж (server host, server port, client host, client port)
до тех пор, пока TIME_WAIT
не закончится (независимо от того, на какой стороне он включен).
Так как три части этого кортежа зафиксированы в вашем сценарии (server host
, server port
, client host
), у вас действительно есть только такие опции:
bind()
/ connect()
в цикле до тех пор, пока соединение не будет работать. client host
значений, используя несколько IP-адресов на вашем клиенте. Вы должны будете иметь приложение bind()
к одному из этих IP-адресов, особенно. server host
/ server port
значений, используя несколько портов и / или IP-адреса на сервере. Позже на той же странице упоминается SO_REUSEADDR. Это то, что вам нужно. Вы обязательно хотите закрыть дескриптор прочитанного файла, когда он вернет нуль.
Настройка SO_REUSEADDR на стороне клиента не помогает стороне сервера, если она также не устанавливает SO_REUSEADDR