LINUX.ORG.RU

Подкажите, как узнать состояние сокета?

 ,


0

2

Подключаюсь к чему-нибудь /usr/bin/openssl s_client -connect <host>:<port> и могу обмениваться данными с сервером. Возможно ли как-то подробнее узнать о состоянии соединения? Чтобы это можно было использовать в баш скриптах...

Например сейчас я из скрипта запускаю openssl ... & и sleep 2 секунды, после чего считаю, что соединение установилось и можно обмениваться данными. Но это же не правильно. В идеале, хочу сделать так, что, когда openssl сообщит, что соединение состоялось, то вызывалась баш-функция on_sockopen() { }, и когда соединение разрывалось - вызывалась on_sockclose() { }. Вообще будет замечательно, если еще до кучи можно будет вызывать on_sockread () { } когда есть данные для приема, и on_sockwrite () { } когда данные были отправлены (приняты) удаленной стороной.

sockopen() {
  [ -e "/tmp/$name" ] && rm --recursive "/tmp/$name"
  mkdir --parents "/tmp/$name"

  mkfifo "/tmp/$name/i"
  mkfifo "/tmp/$name/o"

  /usr/bin/openssl s_client -connect "$1:$2" > "/tmp/$name/i" < "/tmp/$name/o" &

  echo $! > "/tmp/$name/pid"

  exec 3<"/tmp/$name/i"
  exec 4>"/tmp/$name/o"
}
sockread() {
  read -r -t 2 $2 < "/tmp/$sockname/i" || return 1
}
sockwrite() {
  name="$1"
  shift

  echo -n "$*" > "/tmp/$name/o" || return 1
}
sockclose() {
  exec 3<&-
  exec 4<&-
  kill $(< "/tmp/$1/pid") >/dev/null 2>&1

  rm --recursive "/tmp/$1"
}

Сейчас имеется такая «библиотека», но понятное дело, что реализована она в корне не корректно. Это не события, это команды. Использовать их можно для простенького управления соединением, а-ля:

sockname=".sock-test"

sockopen $sockname "www.google.com" 443

if [[ $? == 0 ]]; then
  sockwrite $sockname "GET / HTTP/1.0"$'\x0d\x0a'
  sockwrite $sockname "Host: www.google.com"$'\x0d\x0a'
  sockwrite $sockname $'\x0d\x0a'
fi

while true;
  sockread $sockname data || continue
  echo $data
done

Но а я хочу сделать _нормальную_ баш-библиотеку для управления сокетами на коллбэках, вызывая on_* функции... но вот про openssl не знаю ничего: он как-то предоставляет информацию о передаваемых данных, состоянии соединения?

★★★★★

Использование bash выглядит нерационально. Возьми любой интерпретируемый язык и используй его модули, предназначенные для работы с сокетами.

Chumka ★★★
()
Ответ на: комментарий от Chumka

И я тоже думаю, что скорей всего это попросту невозможно. Но использовать bash дело принципа, и вероятнее всего, буду городить костыли, но все же сделаю то, что хочу.

Спасибо за подтверждение.

Spoofing ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.