powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Linux SetSockOpt error 22
17 сообщений из 17, страница 1 из 1
Linux SetSockOpt error 22
    #39967147
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил использовать не 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
Linux SetSockOpt error 22
    #39967149
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbГде ошибка?

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



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

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



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

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

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

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

Алгоритм такой: ты выставляешь переменную флаг "сливай воду, руби концы" и посылаешь пакет
размером в один байт. Твой цикл чтения после возврата из recv() проверяет эту переменную и
завершает цикл, вызывая shitdown() и closesocket(). Случилось это по твоему пакету или
любому другому - уже совершенно без разницы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Linux SetSockOpt error 22
    #39967168
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не знаете, почему такая разница между 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
Linux SetSockOpt error 22
    #39967174
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbправильно я понимаю, что 4216036 *packets received by filter* это то, сколько я должен
принять?

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

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

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


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


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