(1) У Вас нет доступа к «Партнерской конференции».
Условия предоставления доступа:
Доступ предоставляется руководителям и аттестованным специалистам фирм-франчайзи фирмы «1С». По решению руководителя фирмы-франчайзи доступ может быть предоставлен двум неаттестованным сотрудникам, либо наоборот, для определенного аттестованного сотрудника фирмы доступ может быть ограничен.
Также доступ предоставляется специалистам, приобретшим специальную поставку «1С:Предприятие 8. Комплект специалиста по разработке и внедрению» и не работающим в фирме-франчайзи. Решение о предоставлении доступа принимается руководителем ЦСО или фирмы-франчайзи, продавшей данный комплект.
|
355 / 116 / 20 Регистрация: 08.01.2015 Сообщений: 1,343 Записей в блоге: 1 |
|
|
1 |
|
|
16.08.2018, 20:41. Показов 4855. Ответов 10
Вроде бы, она возвращает либо -1, либо количество принятых байт. В итоге, через какое-то время (несколько секунд) функция recv() перестает ждать данные и возвращает 0, хотя сокет сохраняется. Добавлено через 2 минуты
0 |
|
6318 / 3936 / 1578 Регистрация: 09.05.2015 Сообщений: 9,238 |
|
|
16.08.2018, 20:42 |
2 |
|
Вот описание RETURN VALUE When a stream socket peer has performed an orderly shutdown, the Datagram sockets in various domains (e.g., the UNIX and Internet The value 0 may also be returned if the requested number of bytes to
2 |
|
355 / 116 / 20 Регистрация: 08.01.2015 Сообщений: 1,343 Записей в блоге: 1 |
|
|
16.08.2018, 21:16 [ТС] |
3 |
|
The value 0 may also be returned if the requested number of bytes to Похоже на это. А какое время эта функция ожидает получения байтов (если сокет — блокирующий)? Ссылку я посмотрел, но про время (таймаут) там идет речь лишь в случае неблокирующих сокетов. Добавлено через 1 минуту Добавлено через 2 минуты
if the requested number of bytes to Хотя нет, не то: я запрашиваю 1024 байта. Добавлено через 14 минут
0 |
|
355 / 116 / 20 Регистрация: 08.01.2015 Сообщений: 1,343 Записей в блоге: 1 |
|
|
17.08.2018, 17:11 [ТС] |
4 |
|
Вроде как, функция recv() ждет сколько-то секунд и если никаких данных не поступает, она возвращает значение 0 и программа выполняется дальше, как обычно.
0 |
|
921 / 638 / 198 Регистрация: 08.09.2013 Сообщений: 1,693 |
|
|
17.08.2018, 20:57 |
5 |
|
Вроде как, функция recv() ждет сколько-то секунд и если никаких данных не поступает, она возвращает значение 0 и программа выполняется дальше, как обычно В случае, если задан таймаут и он истек, recv() возвращает -1.
кто бы пояснил, как можно изменить время ожидания Вызовом setsockopt() Строить догадки — занятие творческое, но проще и быстрее прочитать маны.
1 |
|
48 / 46 / 18 Регистрация: 27.04.2016 Сообщений: 169 |
|
|
17.08.2018, 21:58 |
6 |
|
Когда-то мне подобная вещь была нужна, здесь можно почитать про суть, а дальше копать маны.
0 |
|
Почетный модератор 11309 / 4283 / 439 Регистрация: 12.06.2008 Сообщений: 12,342 |
|
|
18.08.2018, 09:17 |
7 |
|
Когда от stream-сокета recv() возвращает 0, значит соединение закрылось. Вообще, 0 у read/recv обычно и означает, что что-то закончилось: достигнут конец файла, отключен tty-адаптер и т.п. Судя по описанию, которое добавил Someone007, только у датаграмм бывает нормальный 0.
2 |
|
921 / 638 / 198 Регистрация: 08.09.2013 Сообщений: 1,693 |
|
|
18.08.2018, 10:09 |
8 |
|
Когда от stream-сокета recv() возвращает 0, значит соединение закрылось. В большинстве случаев так, и логика нескольких извествных мне программ это предполагает. The value 0 may also be returned if the requested number of bytes to receive from a stream socket was 0. И педанты пишут, что кроссплатформенный код не должен опираться на то, что 0 — закрытие сокета.
0 |
|
545 / 222 / 72 Регистрация: 01.03.2011 Сообщений: 612 |
|
|
18.08.2018, 10:29 |
9 |
|
И педанты пишут, что кроссплатформенный код не должен опираться на то, что 0 — закрытие сокета. имеется в виду, что пир сделал что-то типа shutdown(s, SHUT_WR) или что-то другое?
0 |
|
921 / 638 / 198 Регистрация: 08.09.2013 Сообщений: 1,693 |
|
|
18.08.2018, 16:41 |
10 |
|
Решение
имеется в виду, что пир сделал что-то типа shutdown(s, SHUT_WR) или что-то другое? Где-то читал, что есть системы, где при чтении сокета ноль может вернуться при нормальной работе и нужно читать еще раз. Сам с таким не сталкивался, посткольку сетевые программы писал только под Посикс системы. А здесь все просто, если UDP — recv 0 означает пустую датаграмму, если TCP — закрытие соединения, либо сам пытался прочитать 0 байт.
1 |
|
355 / 116 / 20 Регистрация: 08.01.2015 Сообщений: 1,343 Записей в блоге: 1 |
|
|
18.08.2018, 18:27 [ТС] |
11 |
|
Вызовом setsockopt() gng, спасибо! Я даже и не знал, до Вашего ответа, что у сокета можно устанавливать опции еще и этой функцией. Не по теме: Попутно выяснилось, как сделать, чтобы порт, по которому открыт сокет, не оставался занятым после закрытия программы: https://stackoverflow.com/ques… -reuseaddr , второй ответ. Там тоже используется setsockopt(). Тоже полезная вещь.
0 |
- recv() definitely returns = 0 when the other side closed the connection
This is not completely true, in the following code using non-blocking winsock2 tcp, when no data is available, select returns 1 and recv returns 0, as does WSAGetLastError().
fd_set test = {1, socket};
const timeval timeout = {0, 0};
if (!::select(0, &test, nullptr, nullptr, &timeout)) return 0;
int done = ::recv(socket, buffer, 1, 0);
This continues even after the other end has called:
::shutdown(socket, SD_BOTH);
::closesocket(socket);
and then ended. Communication works as expected, it is just ::recv that seems to be «broken».
Сообщения типа
37:35.447041-0,EXCP,1,process=rphost,ClientID=69,Exception=NetDataExchangeException,Descr=’server_addr=(23)[fe80::3470:d26:72ff:4e48%14]:56342 descr=recv returns zero, disconnected line=2291 file=SrcDataExchangeServerImpl.cpp’
37:35.447042-0,EXCPCNTX,0,ClientComputerName=,ServerComputerName=,UserName=,ConnectString=
Ответ фирмы 1С расположен по адресу https://partners.v8.1c.ru/forum/topic/1198922
Для того, что бы определить какой интерфейс используется для передачи данных (т.е. является активным) и какая версия
программного обеспечения процессора системной платы используется в ККТ необходимо распечатать чек тестового прогона.
Получить такой чек можно последовательно выполнив следующие операции:
1) Выключите ККТ;
2) Нажмите и удерживайте кнопку промотки чека;
3) Не отпуская кнопку промотки чека включите питание ККТ;
4) После того как ККТ начала печатать чек тестового прогона, отпустите кнопку промотки чека;
5) Для прерывания печати чека тестового прогона необходимо через некоторый промежуток времени (через 20 — 30 сек)
нажать на кнопку промотки чека.
Поскольку любая ККТ, соответствующая новому порядку применения, обладает несколькими интерфейсами, то это можно использовать для диагностики проблем связанных с отсутствием передачи данных в ОФД, при этом физически не отключая ККТ от ПК, на котором установлено кассовое ПО. Поэтому следующим этапом проведения диагностики является подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра с использованием свободного, не задействованного, интерфейса. Определить свободный интерфейс можно визуально и опираясь на данные приведенные в чеке тестового прогона. Например, строка в тестовом прогоне (см. фото):
говорит о том, что активным (т.е. интерфейсом, через который передаются данные в ОФД) является интерфейс RNDIS (подключение через порт USB). Значит свободным (не задействованным) является интерфейс RS232 (COM).
Если в данной строке напечатано «ETHERNET», то передача данных осуществляется через интерфейс Ethernet и свободным может быть интерфейс RS232 (COM) или USB.
Если в данной строке напечатано «WIFI», то передача данных осуществляется через интерфейс Wi-Fi и свободным может быть так же интерфейс RS232 (COM) или USB.
Определив свободный интерфейс, можно производить подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра.
Рассмотрим ситуацию, когда свободным интерфейсом является RS232 (СОМ). Тогда подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра можно осуществить с использованием интерфейсного кабеля СОМ, из комплекта поставки ККТ с завода изготовителя. После подключения ККТ к ПК нужно выполнить несколько операций.



5) В окне «Свойства Драйвера ФР» введите параметры, которые были получены при поиске оборудования, и нажмите кнопку «Проверка связи» Результат отобразится в поле «Код ошибки» в виде модели устройства и его заводского номера.
После того, как с ККТ установлена связь необходимо убедиться в том, что ККТ имеет доступ в Internet. Для этого в утилите «Тест драйвера ФР» нужно перейти к пункту «15». Прочее» закладка «Команда», в поле «URL» ввести любой существующий публичный адрес (например: www.yandex.ru или адрес ОФД) и нажать не кнопку «Пинг». Если результат пинга будет равен «0», то это говорит о том, что ККТ имеет доступ в Internet. Любой другой результат говорит о том, что доступа в Internet нет.
В случае, если проверка доступа в Internet при помощи пинга дала отрицательный результат, совместно с локальной IT-службой выполните следующие операции.
При использовании для передачи данных интерфейса Ethernet необходимо:
— убедиться, что ККТ физически подключена к локальной сети предприятия;
— Ethernet кабель исправен;
— проверить доступность ККТ по локальной сети с любого ПК, подключенного к данной локальной сети;
Если для передачи данных задействован интерфейс USB (протокол RNDIS) необходимо:
— убедиться, что ККТ физически подключена к ПК при помощи кабеля USB;
— кабель USB исправен;
— порт USB, к которому подключена ККТ, в ПК исправен;
— ПК, к которому подключена ККТ, подключен к локальной сети предприятия и имеет доступ в Internet;
— проверить правильность настройки ККТ в соответствии с инструкцией «Настройка ККТ для передачи данных», которая доступна для
скачивания в «Личном кабинете ЦТО»;
Если ККТ имеет доступ к сети Internet, то для дальнейшей диагностики возможных проблем можно использовать встроенный механизм логирования последней попытки передачи данных. Данное логирование реализовано в таблицах ККТ, а именно в таб. №20 «Статус обмена ФН». Для просмотра лога необходимо открыть указанную таблицу.

При этом содержимое данных полей будет следующим:
-поле №8 «Log0» будет содержать время включения ККТ и активный интерфейс для передачи данных в ОФД (RNDIS, ETH или WIFI);
-поле №9 «Log1» будет содержать время получения и IP-адрес установленный в ККТ (таб. №16 «Сетевой адрес») ;
-поле №10 «Log2» будет содержать время получения и IP-адрес сервера ОФД;
-поле №11 «Log3» будет содержать время и результат подключения к порту ОФД, который указан в таб. №19 «Параметры ОФД»;
-поле №12 «Log4» будет содержать время отправки пакета данных и его размер на сервер ОФД;
-поле №13 «Log5» будет содержать время ответа ОФД и его размер;
-поля №14 по №16 зарезервированы;
-поле №17 «Log9» будет содержать информацию о состоянии связи между ККТ и ПК (или ККТ и локальной сетью, в случае использования Ethernet (ETH));
Ситуация 1. Неверно указан порт или прямой IP-адрес сервера ОФД. При этом лог будет выглядеть следующим образом:
Для устранения данной ситуации необходимо перейти в таб. №19 «Параметры ОФД» и проверить правильность введенных данных в поле №1 «Сервер» и в поле №2 «Порт».
Ситуация 2. Неверно указан адрес сервера ОФД или не доступен DNS-сервер, в случае использования доменного имени сервера ОФД (на примере ОФД-Я: connect.ofd-ya.ru), а не прямого IP-адреса (на примере ОФД-Я: 91.107.67.212). При этом лог может выглядеть как на фото:
Здесь возможны следующие пути решения. Нужно перейти в таб. №19 «Параметры ОФД» и проверить правильность введенных данных в поле №1 «Сервер». Если данные введены корректно и/или указано доменное имя сервера ОФД, то нужно попробовать указать прямой IP-адрес. Затем перезагрузить ККТ и проверить лог. Если вид лога изменится и данные отправятся, то проблема в недоступности DNS-сервера. Для устранения нужно обратиться в IT-службу, обслуживающую локальную сеть предприятия.
Ситуация 3. Локальными политиками безопасности закрыт порт. При этом лог будет выглядеть следующим образом:
Для устранения нужно обратиться в IT-службу, обслуживающую локальную сеть предприятия для открытия доступа к портам сервера ОФД.
Ситуация 4. Есть проблемы с данными о ККТ на сервере ОФД:
Такое сообщение (см. поле №13 «Log5») может возникнуть в том случае если:
-Параметры для подключения ККТ к серверу ОФД указаны корректно, но ККТ не зарегистрирована на сервере ОФД;
-Параметры для подключения ККТ к серверу ОФД указаны корректно, ККТ зарегистрирована на сервере ОФД, но при регистрации ККТ была допущена ошибка в данных: ошибка в РНМ ККТ, зав. номере ККТ и т.д.;
Устранить описанные выше ошибки можно зарегистрировав ККТ в ОФД, используя сервис «Личного кабинета ОФД» или, если ККТ
уже зарегистрирована, нужно зайдя в «Личный кабинет ОФД» сравнить регистрационные данные полученные при печати чека тестового прогона с теми данными, которые введены в «Личном кабинете ОФД». В случае обнаружения ошибок необходимо обратиться в техническую поддержку ОФД.
Ситуация 1. Неверно указан порт или прямой IP-адрес сервера ОФД, то в таблице №20, поле №11 «Log3» будет храниться запись следующего вида:
Для устранения данной ситуации необходимо перейти в таб. №19 «Параметры ОФД» и проверить правильность введенных данных в поле №1 «Сервер» и в поле №2 «Порт».
Ситуация 2. Неверно указан адрес сервера ОФД или не доступен DNS-сервер, в случае использования доменного имени сервера ОФД (на примере ОФД-Я: connect.ofd-ya.ru), а не прямого IP-адреса (на примере ОФД-Я: 91.107.67.212):
Соответственно, нужно перейти в таб. №19 «Параметры ОФД» и проверить правильность введенных данных в поле №1 «Сервер». Если данные введены корректно и/или указано доменное имя сервера ОФД, то нужно попробовать указать прямой IP-адрес. Затем перезагрузить ККТ и проверить лог. Если вид лога изменится и данные отправятся, то проблема в недоступности DNS-сервера. Для устранения нужно обратиться в IT-службу, обслуживающую локальную сеть предприятия.
Ситуация 3. Локальными политиками безопасности закрыт порт. При этом лог будет выглядеть следующим образом:
Для устранения нужно обратиться в IT-службу, обслуживающую локальную сеть предприятия для открытия доступа к портам сервера ОФД.
Ситуация 4. Есть проблемы с данными о ККТ на сервере ОФД:
Такое сообщение (см. поле №13 «Log5») может возникнуть в том случае если:
-Параметры для подключения ККТ к серверу ОФД указаны корректно, но ККТ не зарегистрирована на сервере ОФД;
-Параметры для подключения ККТ к серверу ОФД указаны корректно, ККТ зарегистрирована на сервере ОФД, но при регистрации ККТ была допущена ошибка в данных: ошибка в РНМ ККТ, зав. номере ККТ и т.д.;
Устранить описанные выше ошибки можно зарегистрировав ККТ в ОФД, используя сервис «Личного кабинета ОФД» или, если ККТ
уже зарегистрирована, нужно зайдя в «Личный кабинет ОФД» сравнить регистрационные данные полученные при печати чека тестового прогона с теми данными, которые введены в «Личном кабинете ОФД». В случае обнаружения ошибок необходимо обратиться в техническую поддержку ОФД.


Сообщение было отмечено Htext как решение













