LINUX.ORG.RU

ограничить время работы сокета

 ,


0

2

Имеется сокет под управлением библиотеки SSL

#include <sys/socket>
#include <openssl/ssl.h>
...
sock = sockect(AF_INET, SOCK_STREAM, 0);
...
SSL_library_init();
...
SSL_set_fd(sockSsl, sock);

Как ограничить время работы функций установки соединения, чтения и записи N секундами?

int N = 45;
// что-то, может setsockopt()
...
connect(s, ...);// если за N сек. не соединился, то вернул 0 или что-то отрицательное
...
int l = SSL_read(ssl, buf, len);// если за N сек. не прочитал, то вернул 0 или что-то отрицательное
...
int l = SSL_write(ssl, buf, len)// // если за N сек. не записал, то вернул 0 или что-то отрицательное

P.S. пробовал установить время в setsockopt() - не работает (



Последнее исправление: smartscientist (всего исправлений: 1)

это все делается на неблокирующих сокетах

и очевидно вам такая задача не по силам

поищите себя в чем то другом

anonymous
()
Ответ на: комментарий от smartscientist

на неблокирующих проблем нет, но нужны именно блокирующие, хотя … анонимам это не понять

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

Помогу запарте: EINTR

anonymous
()
Ответ на: комментарий от smartscientist

Если на неблокирующих проблем нет, в чём трудность с написанием обёрток? Гоняй poll() с нужным таймаутом после каждого вызова read/write, получишь поведение как у блокирующих.

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

Да просто разбираюсь, читаю книги, документацию и пытаюсь понять. В неблокирующих операциях чтения и записи можно просто передавать timeout как фактический параметр вызова. В блокирующих такого нет, но есть setsockopt() и ничего не запрещает установить параметр SO_RCVTIMEO или SO_SNDTIMEO

см. man 7 socket, там написано, что эти параметры не влияют select, poll, epoll_wait. Но, ничего не сказано о том, что в блокирующих сокетах они не работают. Я хочу понять почему не работают. Мне не нужно где-то, или для когото сделать затычку, просто хочу разобраться.

P.S. ну или вот мэн страница https://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=socket&category=7 , где о запрете использования setsockopt() для блокирующих сокетов?

smartscientist
() автор топика
Ответ на: комментарий от smartscientist

Скорее всего, у тебя простая ошибка в том месте, в котором ты даже и не ожидаешь ошибки. Например, в том, как ты вызываешь setsockopt().

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

извини, может туплю, но спрошу

а имеет значение установить свойство до коннекта

setsockopt(sock, ...)
connect(sock ...)


или после
connect(sock ...)
setsockopt(sock, ...)

?
smartscientist
() автор топика
Ответ на: комментарий от smartscientist

В обоих случаях должно работать. Таймауты можно в любой момент менять. Они в ядре просто записываются в поле в структуре, описывающей сокет.

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

i-rinat спасибо за помощь! Работает!

Я действительно не там ошибку искал. Оказывается, что даже при разорваннном соединении SSL_write() сообщает, что отправлено правильное число байт … я на этом и попался.

smartscientist
() автор топика
Ответ на: комментарий от kmeaw

Есть ещё один способ решить такую задачу — системный вызов alarm(3p).

Я бы строить логику работы ПО на активном использовании сигналов не посоветовал.

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