EnglishУкраїнськаmRussian
Login/New
Topic with many replies

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


| 1 | 2 | Last
Author Message
Written on: 25. 02. 2020 [12:51]
mr_dsv
Сергій Дорошка
Contributor
Topic creator
registered since: 31.10.2012
Posts: 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
Ну для совместимости с другими системами...
Written on: 25. 02. 2020 [13:14]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 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.
Written on: 26. 02. 2020 [12:13]
mr_dsv
Сергій Дорошка
Contributor
Topic creator
registered since: 31.10.2012
Posts: 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й элемент.
В итоге на разных системах слушаем на разных протоколах.
Как клиенту подключаться...
Written on: 26. 02. 2020 [13:02]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"mr_dsv" wrote:

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

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

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

Learn, learn and learn better than work, work and work.
Written on: 28. 02. 2020 [10:20]
mr_dsv
Сергій Дорошка
Contributor
Topic creator
registered since: 31.10.2012
Posts: 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

......................................
Written on: 28. 02. 2020 [12:16]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 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.
Written on: 01. 01. 2020 [12:32]
tka4ev_s
Сергей Ткачев
registered since: 19.10.2014
Posts: 30
Добрый день !
Периодически сталкиваюсь с неудобством когда прокручиваешь колесико мыши на поле "Язык процедуры" очищается поле кода программы.
если есть возможность сделать чтобы текст программы не удолялся.
Attachment

Снимок экрана от 2021-01-01 13-11-16.png (File type: image/png, Size: 291.38 kilobytes) — 1188 downloads
Written on: 01. 01. 2020 [14:39]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"tka4ev_s" wrote:

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

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

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

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

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

Learn, learn and learn better than work, work and work.
| 1 | 2 | Last



7208