УкраїнськаEnglishРocсийский
Вход/Новый
В теме нет новых постов

Несколько предложений/замечаний...


Автор Сообщение
Сообщение создано: 25. 02. 2020 [12:51]
mr_dsv
Сергей Дорошка
Contributor
Создатель темы
Зарегистрирован(а) с: 31.10.2012
Сообщения: 25
Добрый день Роман!

"накопалось/наболелось" (относится к релизу r2646)

1. ttransports.cpp -> void TTransportS::load_( )
Если нет какого-то транспорота (ну например Serial), то уже в "готовых" приложениях (AGLKS например)
разбор конфигурации идет неправильно...

// Search and create new input transports
...
// Search new into DB and Config-file
SYS->db().at().dbList(db_ls, true);
db_ls.push_back(DB_CFG);
for(unsigned iDB = 0; iDB < db_ls.size(); iDB++)
for(int fld_cnt = 0; SYS->db().at().dataSeek(db_ls[iDB]+"."+subId()+"_in",nodePath()+subId()+"_in",fld_cnt++,c_el,false,&full); ) {
id = c_el.cfg("ID").getS();
type = c_el.cfg("MODULE").getS();
if(modPresent(type) && !at(type).at().inPresent(id))

{ // - added for prevent abort on absent transport

at(type).at().inAdd(id,(db_ls[iDB]==SYS->workDB())?"*.*":db_ls[iDB]);
at(type).at().inAt(id).at().load(&c_el);
itReg[type+"."+id] = true;

} // -

}

.................................................
// Search and create new output transports
...
// Search new into DB and Config-file
SYS->db().at().dbList(db_ls, true);
db_ls.push_back(DB_CFG);
for(unsigned iDB = 0; iDB < db_ls.size(); iDB++)
for(int fld_cnt = 0; SYS->db().at().dataSeek(db_ls[iDB]+"."+subId()+"_out",nodePath()+subId()+"_out",fld_cnt++,c_el,false,&full); ) {
id = c_el.cfg("ID").getS();
type = c_el.cfg("MODULE").getS();
if(modPresent(type) && !at(type).at().outPresent(id))

{ // - added for prevent abort on absent transport

at(type).at().outAdd(id,(db_ls[iDB]==SYS->workDB())?"*.*":db_ls[iDB]);
at(type).at().outAt(id).at().load(&c_el);
itReg[type+"."+id] = true;

} // -

}


2. moduls\transport\Sockets\socket.cpp и moduls\transport\SSL\modssl.cpp
Обработка результатов getaddrinfo(...) "обрывается" на 1-м "удачном" интерфейсе.
В Linux у меня это ipv4 (в QNX или еще где... -> ipv6)
Может обрабатывать все интерфейсы!?

....
} catch(TError &err) {
aErr = err.mess;
if(sockFd >= 0) close(sockFd);
sockFd = -1;
continue; //Try next
}
!!!-> break; //OK
}

3. Может быть добавить в параметры открытия файла ф-ции open(...) флаг O_BINARY
Ну для совместимости с другими системами...
Сообщение создано: 25. 02. 2020 [13:14]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3679
"mr_dsv" wrote:

Если нет какого-то транспорота (ну например Serial), то уже в "готовых" приложениях (AGLKS например)
разбор конфигурации идет неправильно...

Ещё тут осталось, ранее исправлял такое в подсистеме "БД" и "Архивы-История". Лучше так:
Index: ttransports.cpp
===================================================================
--- ttransports.cpp (revision 2665)
+++ ttransports.cpp (working copy)
@@ -117,7 +117,8 @@
for(int fld_cnt = 0; SYS->db().at().dataSeek(itLs[iIt]+"."+subId()+"_in",nodePath()+subId()+"_in",fld_cnt++,c_el,false,&full); ) {
id = c_el.cfg("ID").getS();
type = c_el.cfg("MODULE").getS();
- if(modPresent(type) && !at(type).at().inPresent(id))
+ if(!modPresent(type)) continue;
+ if(!at(type).at().inPresent(id))
at(type).at().inAdd(id,(itLs[iIt]==SYS->workDB())?"*.*":itLs[iIt]);
at(type).at().inAt(id).at().load(&c_el);
itReg[type+"."+id] = true;
@@ -153,7 +154,8 @@
for(int fld_cnt = 0; SYS->db().at().dataSeek(itLs[iIt]+"."+subId()+"_out",nodePath()+subId()+"_out",fld_cnt++,c_el,false,&full); ) {
id = c_el.cfg("ID").getS();
type = c_el.cfg("MODULE").getS();
- if(modPresent(type) && !at(type).at().outPresent(id))
+ if(!modPresent(type)) continue;
+ if(!at(type).at().outPresent(id))
at(type).at().outAdd(id,(itLs[iIt]==SYS->workDB())?"*.*":itLs[iIt]);
at(type).at().outAt(id).at().load(&c_el);
itReg[type+"."+id] = true;


"mr_dsv" wrote:

2. moduls\transport\Sockets\socket.cpp и moduls\transport\SSL\modssl.cpp
Обработка результатов getaddrinfo(...) "обрывается" на 1-м "удачном" интерфейсе.
В Linux у меня это ipv4 (в QNX или еще где... -> ipv6)

И правильно, остальное это другой входной транспорт, как минимум хендлер открытого канала один!

"mr_dsv" wrote:

3. Может быть добавить в параметры открытия файла ф-ции open(...) флаг O_BINARY
Ну для совместимости с другими системами...

Для совместимости с другими системами осуществляется целевая адаптация, а не подобное.
В поддерживаемых и адаптированных оно не нужно значит и нет проблемы!

Learn, learn and learn better than work, work and work.
Сообщение создано: 26. 02. 2020 [12:13]
mr_dsv
Сергей Дорошка
Contributor
Создатель темы
Зарегистрирован(а) с: 31.10.2012
Сообщения: 25
Добрый день.

Пункты 1,3 - понятно.
По 2-му остается неоднозначность...
из примера AGLKS имеем входной транспорт WEB_1 описанный как *:10002
т.е. TCP соединение по порту 10002 на всех интерфейсах (из хелпа)
getaddrinfo(...) - возвращает "массив" - IPv4 - 1й элем. и IPv6 - 2 элем. на linux
- IPv6 - 1й элем. и IPv4 - 2 элем. на qnx 6.5, windows

Модуль Sockets использует только 1й элемент.
В итоге на разных системах слушаем на разных протоколах.
Как клиенту подключаться...
Сообщение создано: 26. 02. 2020 [13:02]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3679
"mr_dsv" wrote:

В итоге на разных системах слушаем на разных протоколах.
Как клиенту подключаться...

В итоге, молча сейчас и подключаются.
У меня с этим нет проблем, а как будут буду и решать!

Если технический аспект рассматривать, а не гипотетический, то кто вообще должен для каждого IP отдельно открывать сокет, получать отдельный хендлер и обслуживать его в отдельном потоке?
Правильно, отдельный транспорт с таким-же адресом, но который подключится к следующему резолвленному IP, после получения ошибки занятости на первом.

Learn, learn and learn better than work, work and work.
Сообщение создано: 28. 02. 2020 [10:20]
mr_dsv
Сергей Дорошка
Contributor
Создатель темы
Зарегистрирован(а) с: 31.10.2012
Сообщения: 25
Добрый день.
В общем у себя решил "неоднозначность" так:

bool isIPv6 = false;
if(addr()[aOff] != '[') host = TSYS::strParse(addr(), 0, ":", &aOff);
else { aOff++; host = TSYS::strParse(addr(), 0, "]:", &aOff); isIPv6 = true;} //Get IPv6

.....................................

if(isIPv6)
hints.ai_family = AF_INET6; //v6 only
else
hints.ai_family = AF_INET; //v4 only

......................................
Сообщение создано: 28. 02. 2020 [12:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3679
Как будто это как-то связано с проблемой открытия нескольких IP и общего адреса в целом.
Из которых второй IPv6 также возвращает ошибку занятости после открытия первого IPv4, что уже системная проблема и при указанной выше конфигурации не будет доступен IPv4.

А прямое подключение на IPv6, по адресу "[::1]:10004" и без всех этих непонятных изменений работает:
root@roman:~# netstat -a | less
tcp 0 0 0.0.0.0:10004 0.0.0.0:* LISTEN
tcp6 0 0 localhost:10004 [::]:* LISTEN


Как успешно осуществляется и подключение ко второму IPv6 для адреса "localhost:10004", опять-же без таких изменений:
tcp 0 0 localhost:10004 0.0.0.0:* LISTEN
tcp6 0 0 localhost:10004 [::]:* LISTEN


P.S. Вы-бы лучше целевую-системную адаптацию для QNX сделали, а не "пытались"!
P.P.S. И к чему тут венда вообще, если оно сейчас через эмуляцию запускается, т.е. там также ядро Linux?!

Learn, learn and learn better than work, work and work.
Сообщение создано: 01. 01. 2020 [12:32]
tka4ev_s
Сергей Ткачев
Зарегистрирован(а) с: 19.10.2014
Сообщения: 30
Добрый день !
Периодически сталкиваюсь с неудобством когда прокручиваешь колесико мыши на поле "Язык процедуры" очищается поле кода программы.
если есть возможность сделать чтобы текст программы не удолялся.
Вложенный файл

Снимок экрана от 2021-01-01 13-11-16.png (Тип файла: image/png, Размер: 291.38 килобайт) — 330 загрузок
Сообщение создано: 01. 01. 2020 [14:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3679
"tka4ev_s" wrote:

Периодически сталкиваюсь с неудобством когда прокручиваешь колесико мыши на поле "Язык процедуры" очищается поле кода программы.
если есть возможность сделать чтобы текст программы не удолялся.

Может подсказку почитать?

Learn, learn and learn better than work, work and work.
Сообщение создано: 01. 01. 2020 [14:55]
tka4ev_s
Сергей Ткачев
Зарегистрирован(а) с: 19.10.2014
Сообщения: 30
там написано, что так и должно быть. Но из за этого случайно удадял весь код пару раз. Хорошо бы если эту операцию нужно было пдтвердить.
Сообщение создано: 01. 01. 2020 [14:59]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3679
"tka4ev_s" wrote:

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

Мне не нужно такое, а восстановить всегда можно перезагрузкой и бекапами.

Learn, learn and learn better than work, work and work.



11196