Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Linux SetSockOpt error 22 / 17 сообщений из 17, страница 1 из 1
08.06.2020, 17:33
    #39967147
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
Решил использовать не Indy для приема/передачи пакетов в Linux.
Создал сокет, принимаю пакеты через recv. Но если мне нужно завершить прием, то у меня не получиться выйти, т.к. recv ждет. Из этой ситуации можно выйти используя SetSockOpt(FSocket, SOL_SOCKET, SO_RCVTIMEO, @FPSocketTimeOut, Len); В Windows нормально отрабатывает, а вот в Linux возвращает ошибку 22 . Как я понял, то ошибка означает, что аргументы не те передаю. Стал копаться в документации. 3-им параметром передается вместо указателя на Integer структура TimeVal. Вот что у меня получилось, но все равно не работает. Где ошибка?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
type
  TTimeVal = record
    tv_sec: Integer; // Секунды
    tv_usec: word;  // Микросекунды //
  end;

  PTimeVal = ^TTimeVal;

new(PSocketTimeOut);
PSocketTimeOut^.tv_sec:= 0;
 PSocketTimeOut^.tv_usec:= FSocketTimeOut;
 Len:=  SizeOf(TTimeVal);
 if SetSockOpt(FSocket, SOL_SOCKET, SO_RCVTIMEO, PSocketTimeOut, Len) = -1 then
errCode:= GetLastError();
 writeln('errCode = ' + errCode.ToString);
...
Рейтинг: 0 / 0
08.06.2020, 17:41
    #39967149
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
cptngrbГде ошибка?

В декларации TTimeVal.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.06.2020, 17:43
    #39967150
iStrannik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
А точно правильно структуру описал?
Код: plaintext
1.
2.
3.
4.
typedef struct timeval {
  long tv_sec;
  long tv_usec;
} TIMEVAL, *PTIMEVAL,



long => Integer;
...
Рейтинг: 0 / 0
08.06.2020, 17:44
    #39967151
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
cptngrbНо если мне нужно завершить прием, то у меня не получиться выйти, т.к. recv ждет.

И, как уже тебе сказали, проще всего это сделать, посылая себе спецпакет. У тебя же всё
равно UDP...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.06.2020, 17:48
    #39967152
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
Dimitry Sibiryakov, когда уже сказали? почему проще?
...
Рейтинг: 0 / 0
08.06.2020, 17:50
    #39967153
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
iStrannik,
Код: pascal
1.
2.
3.
4.
5.
type
  TTimeVal = record
    tv_sec: Integer; 
    tv_usec: Integer;  
  end;



ошибка та же
...
Рейтинг: 0 / 0
08.06.2020, 18:00
    #39967154
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
misha mike не твой псевдоним?..
cptngrbошибка та же

Ну так выясни уже размеры long на своём линухе. А ещё лучше - используй штатное объявление
timeval и не занимайся самодеятельностью.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.06.2020, 18:21
    #39967156
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
Dimitry Sibiryakov,
ник не мой;
в Posix.SysTime объявлен тип timeval. Это решило проблему.
...
Рейтинг: 0 / 0
08.06.2020, 18:25
    #39967157
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
А почему посылка пакета предпочтительнее выставления таймаута?
...
Рейтинг: 0 / 0
08.06.2020, 18:26
    #39967158
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
cptngrb
А почему посылка пакета предпочтительнее выставления таймаута?

потому что в случае отправки пакета всё в твоих руках
...
Рейтинг: 0 / 0
08.06.2020, 18:40
    #39967160
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
defecator, у меня UDP, а значит одного пакета может не хватить (вдруг по дороге потеряется). Значит нужно в цикле отправлять, пока не поймает. Чувствую грабли будут разбросаны. Правда тайм-аут тоже не панацея.
...
Рейтинг: 0 / 0
08.06.2020, 18:40
    #39967161
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
..
...
Рейтинг: 0 / 0
08.06.2020, 18:46
    #39967162
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
cptngrbу меня UDP, а значит одного пакета может не хватить (вдруг по дороге потеряется).

По какой дороге? Ты отправляешь сам его себе. Потеряться этот пакет может по
одной-единственной причине: входной буфер переполнен. Но в этом случае у тебя и recv() не
висит на ожидании.

Алгоритм такой: ты выставляешь переменную флаг "сливай воду, руби концы" и посылаешь пакет
размером в один байт. Твой цикл чтения после возврата из recv() проверяет эту переменную и
завершает цикл, вызывая shitdown() и closesocket(). Случилось это по твоему пакету или
любому другому - уже совершенно без разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.06.2020, 19:43
    #39967168
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
А не знаете, почему такая разница между tcpdump и project1

tcpdump (sudo tcpdump -i enp0s9 -nn udp port 5514 )
Код: plaintext
1.
2.
1452149 packets captured
4216036 packets received by filter
2763887 packets dropped by kernel

project1
Код: plaintext
packets received = 4111075

отправил 4423203 пакета.

правильно я понимаю, что 4216036 packets received by filter это то, сколько я должен принять?
...
Рейтинг: 0 / 0
08.06.2020, 20:03
    #39967174
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
cptngrbправильно я понимаю, что 4216036 *packets received by filter* это то, сколько я должен
принять?

Не совсем. Из них надо вычесть дропнутые ядром.

Или не надо?.. В любом случае смотреть эти цифры бесполезно в силу самой природы UDP.
...
Рейтинг: 0 / 0
08.06.2020, 20:16
    #39967179
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
Dimitry Sibiryakov

Не совсем. Из них надо вычесть дропнутые ядром.


Если вычесть дропнутые ядром, то это будет packets captured
...
Рейтинг: 0 / 0
08.06.2020, 21:49
    #39967190
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linux SetSockOpt error 22
Dimitry Sibiryakov
завершает цикл, вызывая shitdown() и closesocket().
shitdown() - шикарное название для функции обработки ошибок.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Linux SetSockOpt error 22 / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]