УкраїнськаEnglishmRussian
Вхід/Новий
У темі багато повідомлень

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


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

"накопалось/наболелось" (относится к релизу 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
Повідомлення: 3750
"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
Повідомлення: 31
Добрый день.

Пункты 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
Повідомлення: 3750
"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
Повідомлення: 31
Добрый день.
В общем у себя решил "неоднозначность" так:

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
Повідомлення: 3750
Как будто это как-то связано с проблемой открытия нескольких 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 кілобайтів) — 1150 завантажень
Повідомлення створено: 01. 01. 2020 [14:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
"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
Повідомлення: 3750
"tka4ev_s" wrote:

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

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

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



1592