Отправка в офд ошибка recv return 0

(1) У Вас нет доступа к «Партнерской конференции».

Условия предоставления доступа:

Доступ предоставляется руководителям и аттестованным специалистам фирм-франчайзи фирмы «1С». По решению руководителя фирмы-франчайзи доступ может быть предоставлен двум неаттестованным сотрудникам, либо наоборот, для определенного аттестованного сотрудника фирмы доступ может быть ограничен.

Также доступ предоставляется специалистам, приобретшим специальную поставку «1С:Предприятие 8. Комплект специалиста по разработке и внедрению» и не работающим в фирме-франчайзи. Решение о предоставлении доступа принимается руководителем ЦСО или фирмы-франчайзи, продавшей данный комплект.

355 / 116 / 20

Регистрация: 08.01.2015

Сообщений: 1,343

Записей в блоге: 1

1

16.08.2018, 20:41. Показов 4855. Ответов 10


Студворк — интернет-сервис помощи студентам

Вроде бы, она возвращает либо -1, либо количество принятых байт.
Я отправляю сообщения от браузера на самодельный сервер, там сообщения принимаются функцией recv(). Так вот, в некоторых случаях она возвращает 0. При этом сокет принимается, т.к. accept равно целому положительному числу. Получается, что сокет принимается, но данные браузером не передаются?

В итоге, через какое-то время (несколько секунд) функция recv() перестает ждать данные и возвращает 0, хотя сокет сохраняется.

Добавлено через 2 минуты
Почему так происходит?



0



Эксперт .NET

6318 / 3936 / 1578

Регистрация: 09.05.2015

Сообщений: 9,238

16.08.2018, 20:42

2

Вот описание

RETURN VALUE
These calls return the number of bytes received, or -1 if an error
occurred. In the event of an error, errno is set to indicate the
error.

When a stream socket peer has performed an orderly shutdown, the
return value will be 0 (the traditional «end-of-file» return).

Datagram sockets in various domains (e.g., the UNIX and Internet
domains) permit zero-length datagrams. When such a datagram is
received, the return value is 0.

The value 0 may also be returned if the requested number of bytes to
receive from a stream socket was 0.



2



355 / 116 / 20

Регистрация: 08.01.2015

Сообщений: 1,343

Записей в блоге: 1

16.08.2018, 21:16

 [ТС]

3

Цитата
Сообщение от Someone007
Посмотреть сообщение

The value 0 may also be returned if the requested number of bytes to
receive from a stream socket was 0.

Похоже на это. А какое время эта функция ожидает получения байтов (если сокет — блокирующий)? Ссылку я посмотрел, но про время (таймаут) там идет речь лишь в случае неблокирующих сокетов.

Добавлено через 1 минуту
Или это время определяется браузером, в моем случае?

Добавлено через 2 минуты

Цитата
Сообщение от Htext
Посмотреть сообщение

if the requested number of bytes to
receive from a stream socket was 0

Хотя нет, не то: я запрашиваю 1024 байта.

Добавлено через 14 минут
Такое впечатление, что в некоторых ситуациях, при отправке запроса, браузер вначале создает сокет (а мой сервер его принимает при помощи accept() ). Однако, если нет данных для передачи серверу, то браузер… закрывает сокет через несколько секунд.
Правильно я ли понимаю, что именно это событие и вызывает срабатывание функции recv() на сервере, которая возвращает 0, так как ничего не было передано?



0



355 / 116 / 20

Регистрация: 08.01.2015

Сообщений: 1,343

Записей в блоге: 1

17.08.2018, 17:11

 [ТС]

4

Вроде как, функция recv() ждет сколько-то секунд и если никаких данных не поступает, она возвращает значение 0 и программа выполняется дальше, как обычно.
Эх, вот кто бы пояснил, как можно изменить время ожидания (эти несколько секунд), сделав его равным, допустим, 1 минуте. Или оно на системном уровне прошито?



0



921 / 638 / 198

Регистрация: 08.09.2013

Сообщений: 1,693

17.08.2018, 20:57

5

Цитата
Сообщение от Htext
Посмотреть сообщение

Вроде как, функция recv() ждет сколько-то секунд и если никаких данных не поступает, она возвращает значение 0 и программа выполняется дальше, как обычно
.

В случае, если задан таймаут и он истек, recv() возвращает -1.

Цитата
Сообщение от Htext
Посмотреть сообщение

кто бы пояснил, как можно изменить время ожидания

Вызовом 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

Цитата
Сообщение от Humanoid
Посмотреть сообщение

Когда от 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

Цитата
Сообщение от gng
Посмотреть сообщение

И педанты пишут, что кроссплатформенный код не должен опираться на то, что 0 — закрытие сокета.

имеется в виду, что пир сделал что-то типа shutdown(s, SHUT_WR) или что-то другое?



0



921 / 638 / 198

Регистрация: 08.09.2013

Сообщений: 1,693

18.08.2018, 16:41

10

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

Решение

Цитата
Сообщение от prik
Посмотреть сообщение

имеется в виду, что пир сделал что-то типа 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

Цитата
Сообщение от gng
Посмотреть сообщение

Вызовом 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

Снимок1849

Для того, что бы определить какой интерфейс используется для передачи данных (т.е. является активным) и какая версия
программного обеспечения процессора системной платы используется в ККТ необходимо распечатать чек тестового прогона.
Получить такой чек можно последовательно выполнив следующие операции: 

1) Выключите ККТ; 

2) Нажмите и удерживайте кнопку промотки чека; 

3) Не отпуская кнопку промотки чека включите питание ККТ; 

4) После того как ККТ начала печатать чек тестового прогона, отпустите кнопку промотки чека; 

5) Для прерывания печати чека тестового прогона необходимо через некоторый промежуток времени (через 20 — 30 сек)
нажать на кнопку промотки чека.

Поскольку любая ККТ, соответствующая новому порядку применения, обладает несколькими интерфейсами, то это можно использовать для диагностики проблем связанных с отсутствием передачи данных в ОФД, при этом физически не отключая ККТ от ПК, на котором установлено кассовое ПО. Поэтому следующим этапом проведения диагностики является подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра с использованием свободного, не задействованного, интерфейса. Определить свободный интерфейс можно визуально и опираясь на данные приведенные в чеке тестового прогона. Например, строка в тестовом прогоне (см. фото):


говорит о том, что активным (т.е. интерфейсом, через который передаются данные в ОФД) является интерфейс RNDIS (подключение через порт USB). Значит свободным (не задействованным) является интерфейс RS232 (COM).
Если в данной строке напечатано «ETHERNET», то передача данных осуществляется через интерфейс Ethernet и свободным может быть интерфейс RS232 (COM) или USB.
Если в данной строке напечатано «WIFI», то передача данных осуществляется через интерфейс Wi-Fi и свободным может быть так же интерфейс RS232 (COM) или USB.
Определив свободный интерфейс, можно производить подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра.

Рассмотрим ситуацию, когда свободным интерфейсом является RS232 (СОМ). Тогда подключение ККТ к переносному ПК специалиста аккредитованного сервисного центра можно осуществить с использованием интерфейсного кабеля СОМ, из комплекта поставки ККТ с завода изготовителя. После подключения ККТ к ПК нужно выполнить несколько операций.

2) Затем выполнить поиск подключенной ККТ нажав кнопку «Поиск оборудования»

3) В открывшемся окне инициировать поиск нажав на кнопку «Начать».

4) Если связь с устройством есть, то по окончании поиска результат будет выведен в окне поиска. Далее следует закрыть поиск.



5) В окне «Свойства Драйвера ФР» введите параметры, которые были получены при поиске оборудования, и нажмите кнопку «Проверка связи» Результат отобразится в поле «Код ошибки» в виде модели устройства и его заводского номера.



После того, как с ККТ установлена связь необходимо убедиться в том, что ККТ имеет доступ в Internet. Для этого в утилите «Тест драйвера ФР» нужно перейти к пункту «15». Прочее» закладка «Команда», в поле «URL» ввести любой существующий публичный адрес (например: www.yandex.ru или адрес ОФД) и нажать не кнопку «Пинг». Если результат пинга будет равен «0», то это говорит о том, что ККТ имеет доступ в Internet. Любой другой результат говорит о том, что доступа в Internet нет.


В случае, если проверка доступа в Internet при помощи пинга дала отрицательный результат, совместно с локальной IT-службой выполните следующие операции.

При использовании для передачи данных интерфейса Ethernet необходимо:

— убедиться, что ККТ физически подключена к локальной сети предприятия;

— Ethernet кабель исправен;

— проверить доступность ККТ по локальной сети с любого ПК, подключенного к данной локальной сети;

Если для передачи данных задействован интерфейс USB (протокол RNDIS) необходимо:

— убедиться, что ККТ физически подключена к ПК при помощи кабеля USB;

— кабель USB исправен;

— порт USB, к которому подключена ККТ, в ПК исправен;

— ПК, к которому подключена ККТ, подключен к локальной сети предприятия и имеет доступ в Internet;

— проверить правильность настройки ККТ в соответствии с инструкцией «Настройка ККТ для передачи данных», которая доступна для

скачивания в «Личном кабинете ЦТО»;

Если ККТ имеет доступ к сети Internet, то для дальнейшей диагностики возможных проблем можно использовать встроенный механизм логирования последней попытки передачи данных. Данное логирование реализовано в таблицах ККТ, а именно в таб. №20 «Статус обмена ФН». Для просмотра лога необходимо открыть указанную таблицу.

В случае, когда ККТ передает данные в ОФД, лог (поля с №8 по №17) будет выглядеть следующим образом:


При этом содержимое данных полей будет следующим:

-поле №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») может возникнуть в том случае если:

-Параметры для подключения ККТ к серверу ОФД указаны корректно, но ККТ не зарегистрирована на сервере ОФД;

-Параметры для подключения ККТ к серверу ОФД указаны корректно, ККТ зарегистрирована на сервере ОФД, но при регистрации ККТ была допущена ошибка в данных: ошибка в РНМ ККТ, зав. номере ККТ и т.д.;

Устранить описанные выше ошибки можно зарегистрировав ККТ в ОФД, используя сервис «Личного кабинета ОФД» или, если ККТ

уже зарегистрирована, нужно зайдя в «Личный кабинет ОФД» сравнить регистрационные данные полученные при печати чека тестового прогона с теми данными, которые введены в «Личном кабинете ОФД». В случае обнаружения ошибок необходимо обратиться в техническую поддержку ОФД.

Возможно, вам также будет интересно:

  • Отправитьдляобработки ошибка работы с интернет превышено время ожидания
  • Отправитьдляобработки ошибка работы с интернет не могу установить соединение
  • Отправитьдляобработки ошибка при выполнении файловой операции
  • Отправитьдляобработки ошибка доступа к файлу
  • Отправить сообщение об ошибке xiaomi

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии