|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Нужно опрашивать некое устройство по TCP раз в секунду. Запрос и ответ по 40 байт. На клиентской стороне Raspberry, Linux, Qt, QTcpSocket. Условия связи плохие, бывают помехи. Как лучше поступить - открывать сокет перед каждой посылкой и закрывать после обмена или открыть один раз и обмениваться пока не произойдёт ошибка, потом переоткрывать. Второй вопрос по линуксу - при открытии COM-порта, например, создаётся файл с дескриптором. Может быть то же самое происходит при открытии сокета? Тогда это может быть не полезно для флешки, на которой стоит линукс. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 08:52 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Нет смысла каждый раз соединение устанавливать. Достаточно один раз установить и через него запросы слать. Если порвется, то установить заново. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 08:58 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
zvb73Второй вопрос по линуксу - при открытии COM-порта, например, создаётся файл с дескриптором. Может быть то же самое происходит при открытии сокета? Тогда это может быть не полезно для флешки, на которой стоит линукс. Думаю что не создается. А за флэшку не переживай, у современной флэш-памяти ресурс огромный, все проблемы с малым количеством циклов перезаписи в далеком прошлом. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 09:01 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
zvb73Как лучше поступить - открывать сокет перед каждой посылкой и закрывать после обмена или открыть один раз и обмениваться пока не произойдёт ошибка, потом переоткрывать. Лучше открывать как можно реже. Потому что в типичной системе количество локальных TCP портов ограничено (несколько тысяч, максимум 65 тыс), а каждое соединение расходует один локальный порт, который потом освобождается не сразу, а через 2 минуты (читайте про TCP time_wait). Поэтому при достаточно частых запросах, будет ситуация когда вы не сможете создать новое соединение, т.к. все порты будут в time_wait. Хотя раз в секунду - это конечно не те скорости, чтобы эта проблема возникла :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 13:12 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyлокальный порт, который потом освобождается не сразу, а через 2 минуты Только если соединение закрывается некорректно, без вызова shutdown() на обоих сторонах. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 13:29 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Нет. Timewait возникает в любом случае на той стороне которая разрывает соединение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 13:58 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyTimewait возникает в любом случае на той стороне которая разрывает соединение. У меня не возникает. Единственное назначение этого состояния - не позволить перемешаться пакетам двух разных подключений, поскольку они взаимоидентифицируются четвёркой "локальный адрес+локальный порт+удалённый адрес+удалённый порт" из заголовка пакета. Если обе стороны подключения были закрыты корректно и fin-пакеты прошли, то сокет выводится из этого состояния и порт освобождается без дальнейшего ожидания таймаута. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 15:09 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
у Стивенса в 13-й главе всё подробно расписано ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 15:12 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovAnatoly MoskovskyTimewait возникает в любом случае на той стороне которая разрывает соединение. У меня не возникает. Единственное назначение этого состояния - не позволить перемешаться пакетам двух разных подключений, поскольку они взаимоидентифицируются четвёркой "локальный адрес+локальный порт+удалённый адрес+удалённый порт" из заголовка пакета. Если обе стороны подключения были закрыты корректно и fin-пакеты прошли, то сокет выводится из этого состояния и порт освобождается без дальнейшего ожидания таймаута. Стороне, которая отправила последний ACK на последний FIN, неизвестно, дошел ли этот ACK. И она ждет возможного ретрансмита FIN чтобы снова отправить ACK. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 15:22 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovУ меня не возникает. То что разными настройками ОС можно влиять на TW (в т.ч. игнорировать) никак не отменяет того факта, что это стандартное и нормальное состояние сокета. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 15:55 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyТо что разными настройками ОС можно влиять на TW (в т.ч. игнорировать) никак не отменяет того факта, что это стандартное и нормальное состояние сокета. Настройки у меня стандартны, фишка именно в правильном протоколе завершения соединения: 1) shutdown(SD_SEND) 2) recv() до получения 0 3) shutdown(SD_BOTH) 4) closesocket() Пропуск первого или третьего пункта (а возможно и второго) оставляет висячий TIME_WAIT. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 17:15 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov2) recv() до получения 0 Т.е. вы ждете пока вторая сторона разорвет соединение. Тогда естественно timewait будет не у вас, а с той стороны ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 17:41 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyТогда естественно timewait будет не у вас, а с той стороны Во-первых, этот протокол должен выполняться с обеих сторон. Во-вторых, time_wait в принципе бывает только на одной стороне - той, которая устанавливает соединение, ибо только она использует эфемерные порты. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 18:10 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovВо-первых, этот протокол должен выполняться с обеих сторон. Во-вторых, time_wait в принципе бывает только на одной стороне - той, которая устанавливает соединение, ибо только она использует эфемерные порты. Нет. time_wait на серверной стороне точно так же возникает. И повторно клиент с тем же портом туда не подключится пока time_wait не закончится, даже если у клиента time_wait не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 18:57 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovAnatoly MoskovskyТогда естественно timewait будет не у вас, а с той стороны Во-первых, этот протокол должен выполняться с обеих сторон. Во-вторых, time_wait в принципе бывает только на одной стороне - той, которая устанавливает соединение, ибо только она использует эфемерные порты. Вообще никак не зависит от того, кто устанавливает соединение. Только от того, кто первым разрывает (точнее, кто последний послал ACK). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:20 |
|
Как часто можно открывать TCP сокет?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovAnatoly MoskovskyТо что разными настройками ОС можно влиять на TW (в т.ч. игнорировать) никак не отменяет того факта, что это стандартное и нормальное состояние сокета. Настройки у меня стандартны, фишка именно в правильном протоколе завершения соединения: 1) shutdown(SD_SEND) 2) recv() до получения 0 3) shutdown(SD_BOTH) 4) closesocket() Пропуск первого или третьего пункта (а возможно и второго) оставляет висячий TIME_WAIT. time_wait тут начинается после 2 пункта ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2019, 19:24 |
|
|
start [/forum/topic.php?fid=57&msg=39788496&tid=2017648]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 277ms |
total: | 415ms |
0 / 0 |