Ошибка scanf в visual studio
Remarks
Отключить предупреждение
Чтобы устранить проблему C4996, обычно рекомендуется изменить код. Вместо этого используйте предложенные функции и глобальные переменные. Если необходимо использовать существующие функции или переменные по соображениям переносимости, можно отключить предупреждение.
Отключение предупреждения для определенной строки кода
Отключение предупреждения в файле
Отключение предупреждения в сборках из командной строки
Чтобы отключить предупреждение глобально в сборках командной строки, используйте /wd4996 параметр командной строки.
Отключение предупреждения для проекта в Visual Studio
чтобы отключить предупреждение для всего проекта в Visual Studio IDE, выполните следующие действия.
Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.
Выберите страницу свойств свойства конфигурации > C/C++ > Дополнительно .
Отключение предупреждения с помощью макросов препроцессора
Вы также можете использовать макросы препроцессора, чтобы отключить некоторые определенные классы предупреждений об устаревании, используемых в библиотеках. Эти макросы описаны ниже.
Чтобы определить макрос препроцессора в Visual Studio:
Откройте диалоговое окно страницы свойств для проекта. Сведения об использовании диалогового окна страницы свойств см. в разделе страницы свойств.
Разверните Свойства конфигурации > препроцессора > C/C++.
Ниже приведены некоторые из распространенных источников предупреждений и ошибок C4996:
Имена функций POSIX
The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: new-name. See online help for details.
Корпорация Майкрософт переименовала некоторые библиотечные функции POSIX и Microsoft в CRT, чтобы они соответствовали ограничениям C99 и C++ 03 в зарезервированных и глобальных именах, определяемых реализацией. Только имена являются устаревшими, а не сами функции. В большинстве случаев в имя функции добавляется символ подчеркивания для создания имени. Компилятор выдает предупреждение об устаревании для имени исходной функции и предлагает предпочтительное имя.
Чтобы устранить эту проблему, обычно рекомендуется изменить код так, чтобы вместо него использовались предлагаемые имена функций. Однако обновленные имена относятся только к Microsoft. Если необходимо использовать имена существующих функций по соображениям переносимости, можно отключить эти предупреждения. Функции по-прежнему доступны в библиотеке с их исходными именами.
Чтобы отключить предупреждения об устаревании для этих функций, определите макрос препроцессора _CRT_NONSTDC_NO_WARNINGS . Этот макрос можно определить в командной строке, включив параметр /D_CRT_NONSTDC_NO_WARNINGS .
Небезопасные функции библиотеки CRT
This function or variable may be unsafe. Consider using safe-version instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Корпорация Майкрософт не имеет устаревших функций и глобальных библиотек CRT и C++, так как доступны более безопасные версии. Большинство устаревших функций допускают непроверенный доступ на чтение или запись к буферам. Их неправильное использование может привести к серьезным проблемам безопасности. Компилятор выдает предупреждение об устаревании для этих функций и предлагает предпочтительную функцию.
Чтобы устранить эту проблему, рекомендуется вместо этого использовать функцию или переменную safe-version . Иногда вы не можете обеспечить переносимость или обратную совместимость. Тщательно проверьте, не возможно ли перезапись или Пересчитывание буфера в коде. После этого предупреждение можно отключить.
Чтобы отключить предупреждения об устаревании для этих функций в CRT, определите _CRT_SECURE_NO_WARNINGS .
Чтобы отключить предупреждения о нерекомендуемых глобальных переменных, определите _CRT_SECURE_NO_WARNINGS_GLOBALS .
дополнительные сведения об этих устаревших функциях и глобальных параметрах см. в разделе функции безопасности в библиотеках CRT и Сейф: стандартная библиотека C++.
Ненадежные функции стандартной библиотеки
'std:: function_name ::_Unchecked_iterators::_Deprecate' Call to std:: function_name with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
в Visual Studio 2015 это предупреждение появляется в отладочных сборках, так как некоторые функции шаблона стандартной библиотеки C++ не проверяют правильность параметров. Часто это обусловлено тем, что функции не хватает информации для проверки границ контейнера. Или, так как итераторы могут неправильно использоваться функцией. Это предупреждение помогает понять эти функции, так как они могут быть источником серьезных брешей в системе безопасности в программе. Дополнительные сведения см. в разделе проверенные итераторы.
Например, это предупреждение отображается в режиме отладки std::copy , если вместо простого массива передается указатель на элемент. Чтобы устранить эту проблему, используйте соответствующий объявленный массив, чтобы библиотека могла проверять экстенты массива и проверять границы.
Несколько стандартных алгоритмов библиотеки были обновлены в версии C++ 14 с двумя диапазонами. При использовании двух версий диапазона второй диапазон предоставляет необходимые проверки границ:
В этом примере показано несколько способов использования стандартной библиотеки для проверки использования итератора, и если непроверенное использование может быть опасным:
Если вы проверили, что в коде не может быть ошибки переполнения буфера, это предупреждение можно отключить. Чтобы отключить предупреждения для этих функций, определите _SCL_SECURE_NO_WARNINGS .
Проверенные итераторы включены
Предупреждение C4996 также может возникать, если не используется проверяемый итератор, если _ITERATOR_DEBUG_LEVEL определен как 1 или 2. По умолчанию для сборок в режиме отладки установлено значение 2, а для розничных сборок — 0. Дополнительные сведения см. в разделе проверенные итераторы.
Ненадежный код MFC или ATL
Предупреждение C4996 может возникать при использовании функций MFC или ATL, которые являются устаревшими по соображениям безопасности.
Чтобы устранить эту проблему, настоятельно рекомендуется изменить код, чтобы вместо этого использовать обновленные функции.
Сведения о подавлении этих предупреждений см. в разделе _AFX_SECURE_NO_WARNINGS .
Устаревшие функции и переменные CRT
This function or variable has been superseded by newer library or operating system functionality. Consider using new_item instead. See online help for details.
Некоторые функции и глобальные переменные библиотеки устарели. Эти функции и переменные могут быть удалены в будущей версии библиотеки. Компилятор выдает предупреждение об устаревании для этих элементов и предлагает предпочтительную альтернативу.
Чтобы устранить эту проблему, мы рекомендуем изменить код для использования предлагаемой функции или переменной.
Чтобы отключить предупреждения об устаревании для этих элементов, определите _CRT_OBSOLETE_NO_WARNINGS . Дополнительные сведения см. в документации по устаревшей функции или переменной.
Ошибки маршалирования в коде CLR
Предупреждение C4996 также может возникать при использовании библиотеки маршалирования CLR. В этом случае C4996 является ошибкой, а не предупреждением. Эта ошибка возникает при использовании marshal_as для преобразования между двумя типами данных, для которых требуется marshal_context класс. Эту ошибку также можно получить, когда библиотека упаковки не поддерживает преобразование. Дополнительные сведения о библиотеке упаковки см. в разделе Общие сведения о маршалировании в C++.
Этот пример приводит к возникновению предупреждения C4996, поскольку библиотеке маршалирования требуется контекст для преобразования из в System::String const char * .
Пример: определяемая пользователем устаревшая функция
Атрибут можно использовать deprecated в собственном коде для предупреждения вызывающих объектов, когда больше не рекомендуется использовать определенные функции. В этом примере C4996 создается в двух местах: по одному для строки, для которой объявлена устаревшая функция, а другая — для строки, в которой используется функция.
В свете множества недавних статей, посвящённых статическому анализу кода на С++, пользователи неоднократно интересовались анализатором cppcheck. Это относительно молодой проект статического анализа с открытым исходным кодом, ориентированный в первую очередь на нахождение реальных ошибок в коде с минимальным количеством ложных срабатываний.
Совсем недавно cppcheck помог найти уязвимость в проекте Xorg, которая существовала там почти 23 года! Он помог уже тысячам программистов по всему миру, на официальном сайте можно найти информацию о найденных с помощью cppcheck уязвимостях в программах, и этот список постоянно растёт. Итак, если вы хотите знать, почему нужно использовать cppcheck всегда и везде — прошу под кат.
CppCat и cppcheck
Начну со сравнения этих утилит, поскольку данная просьба озвучивалась неоднократно в комментариях. Разработчики CppCat уже самостоятельно провели такое сравнение (с PVS-Studio), но с тех пор утекло много воды, а сравнение не очень объективно, так как PVS-Studio (насколько я понимаю всю замысловатость фразы «Please write us to get a price for PVS-Studio. Please specify interesting license type.») не предназначена для программистов-одиночек. CppCat же, как и cppcheck, доступен каждому (с оговоркой на привязку к VisualStudio определённых версий и лицензию на год).
Сравнить эти анализаторы будет непросто: у меня не имеется под руками ни одной версии Visual Studio под Linux. Поэтому сначала я ограничусь анализом уже проанализированного кода в недавнем обзоре CppCat: натравлю cppcheck на Notepad++, приведу статистику ошибок/предупреждений, которые можно будет сравнить с уже готовым анализом CppCat.
Параллельно пробую поставить в виртуальной машине CppCat. Надо сказать, что после того как Visual Studio 2010 был установлен, инсталлятор недолго думая выдал следующее:
Из-за чего тестирование усложнилось квестом найди-поставь-Visual-Studio-2013-переустанови-IE-11-перезагрузись-обновись, что на виртуалке, не обременённой обновлениями, заняло ровно полдня.
Что в итоге? При открытии проекта Notepad++ Visual Studio гордо завис. Попытка создать новый проект привела к тому, что в анализе CppCat посыпались ошибки о не найденных заголовочных файлах. По сему сравнивать придётся с тем, что имеем в предыдущей статье. Хотя Visual Studio я ставлю практически в первый раз, но эффект «юзабилити» налицо.
Подготовка
Так как cppcheck — проект с открытым исходным кодом, никто не мешает загрузить самую свежую версию из гита и скомпилировать её самостоятельно. Cppcheck предназначен для разработчиков, поэтому компиляция программы из исходного кода не должна вызывать каких-либо проблем:
Готово. Я специально взял свежую версию из гита и положил её в отдельную папку — с ней будет проще работать, так как в дальнейшем cppcheck можно сильно улучшить и настроить «под себя».
Тестовая конфигурация: RHEL 6.1, процессор i5-2400 @ 3.10GHz (для оценки времени работы анализатора).
Удобства ради действия будут производится в командной строке — при желании их можно будет повторить (в Linux:). Конечно, cppcheck имеет несколько плагинов для популярных IDE, но сегодня не об этом.
Анализ Notepad++
cppcheck устроен так, что все предупреждения отсортированы по категориям. По умолчанию включён только один вид анализа — error (ошибки). Ошибки нельзя игнорировать, так как если cppcheck выдал error — это место придётся переписывать в 99% случаев. Основной улов cppcheck — утечки памяти и переполнение буфера, а это уже чего-то стоит.
Может возникнуть резонный вопрос — как анализировать notepad++ в операционной системе Linux, если notepad++ использует исключительно WInAPI? Ответ прост — cppcheck на моей памяти единственный анализатор, который не привязан к сборочной среде или операционной системе. Он использует свой лексический анализатор, не требует обязательного присутствия всех заголовочных файлов, лояльно относится к хитросплетениям классов и т. п. Это замечательное свойство позволяет использовать cppcheck где угодно и для чего угодно, чего не скажешь о CppCat (см. квест по установке выше).
Анализ с помощью cppcheck прост до безобразия:
Пока проводится простейший анализ «из коробки». Команда определяет два параметра -q («тихий» режим — не выводить прогресс выполнения на экран) и -j4 — многопоточный анализ в 4 потока по количесву ядер процессора.
Результат выполнения предыдущей команды:
Время работы — 5 минут. В глаза сразу бросается ошибка "(error) Internal error. Token::Match called with varid 0. Please report this to Cppcheck developers". Это означает, что вместо бага в анализируемой программе нашёлся баг в самом анализаторе:) Сделаем скидку на то, что проект заточен под Win, и cppcheck не подозревает, что означают DWORD, LPTR и т. п. Возможно, в Win он покажет себя иначе.
Реально нашлась всего одна ошибка (с разницей в 2 строчки). Неплохо, возможно, что автор notepad++ сам пользуется cppcheck. Участок кода, который вызвал у cppcheck подозрение:
Это выглядит как ложное срабатывание, хотя исходники, честно говоря, шокируют. UPD: это всё-таки undefined behaviour, массив нужно освобождать с помощью оператора delete [].
Но это ещё не всё. Дело в том, что девизом cppcheck является отсутствие ложных срабатываний, то есть по умолчанию сканер ищет только очень критические ошибки — переполнение буфера, утечки памяти. После того как все ошибки найдены, можно просканировать повторно, включив флаги предупреждений:
Используется параметр --enable, который включает категории проверок:
— performance — проблемы производительности;
— portability — проблемы совместимости;
— warning — предупреждения — подозрительные места программы;
— style — ошибки стиля программирования.
В таком режиме вылавливается львиная доля стилистических/логических ошибок и потенциальных багов (т. е. ошибки, в которых cppcheck «не уверен»). Время сканирования — 5 минут. Результат я сразу отправил в файл, чтобы собрать статистику.
Небольшая статистика по типу найденных ошибок:
Море переменных не инициализировано в конструкторе: (warning) Member variable % is not initialized in the constructor. Это ошибку cppcheck считает предупреждением. Возможно, поведение такого кода зависит от компилятора, потому что npp каким-то чудом работает.
Инициализация переменной не в конструкторе, а в функции init, так что на мой взгляд ворнинги по делу.
(style) Same expression on both sides of '||'. Проверка одного и того же условия. Эту же ошибку выдавал CppCat, однако то ли в той статье версия npp старая, то ли ошибку уже пофиксили, но сейчас тот самый код выглядит так:
А это — новая добыча cppcheck:
(performance) Variable 'lineIndent' is reassigned a value before the old one has been used. По сути — двойное присваивание. Обычно это следствие копипасты, но cppckeck характеризует такую ошибку как ошибку производительности. Этот код стоит проверить, так как неизвестно, что подразумевал автор программы. Таких двойных присваиваний, а также неиспользуемых значений переменных по коду очень много:
Это предупреждение обычно бесполезно — редко, когда в данном участке кода есть ошибка, просто при рефакторинге забыли удалить старое значение.
(portability) The extra qualification 'FunctionListPanel::' is unnecessary and is considered an error by many compilers. Полезное предупреждение, которого физически нет и не планируется в CppCat: ошибки переносимости между разными платформами (portability). Данный кусок кода будет работать не во всех компиляторах:
(style) Exception should be caught by reference. Интересное предупреждение — ловить исключение следует по ссылке, а не по значению:
(style) Consecutive return, break, continue, goto or throw statements are unnecessary. Мёртвый код: break после return:
(warning) Assignment of function parameter has no effect outside the function. Обычно это полезное предупреждение, сигнализирующее об опечатке — значение, присвоенное внутри функции, никуда не передаётся. Однако здесь это очевидно ложное срабатывание, так как value — переменная класса:
(portability) scanf without field width limits can crash with huge input data on some versions of libc. Подобная привычка использования scanf может привести к опасному переполнению буфера. В случае числовых переменных это банальный undefined behaviour:
Для преобразования чисел лучше использовать безопасный strtol.
Ещё один представитель:
Здесь нет переполнения буфера только потому, что wordBuffer и sKeywordBuffer одинакового размера.
(style) 'TiXmlStringA::operator=' should return 'TiXmlStringA &'. Оператор = возвращает void:
С таким оператором нельзя использовать стандартную для C++ цепочку:
(warning) The class 'ControlsTab' defines member variable with name '_isVertical' also defined in its parent class 'TabBar'. Ошибка двойного определения переменной в классе:
которая уже определена в родительском классе:
Не являясь экспертом в плюсах, не могу сразу ответить, можно ли так делать (protected/private).
(style) Found duplicate branches for 'if' and 'else'. Аналогичные ошибки нашёл и CppCat. Лишнее условие:
Думаю, если бы у меня были заголовочные файлы винды, можно указать путь к ним через параметр -I, тогда ошибок будет значительно больше.
(style) Array index 'j' is used before limits check. Несмотря на то что предупреждение низкоприоритетное, найденная ошибка представляет опасность выхода за границы массива:
Учитывая, что параметр startcol внешний, можно вылететь за границу массива, не говоря об индексе -1.
(style) Unsigned variable 'i' can't be negative so it is unnecessary to test it. Условие в цикле всегда положительно => бесконечный цикл:
Этой ошибки можно было бы избежать при сборке проекта компилятором gcc и флагами -Wall -Wextra. Думаю, такая ошибка часто появляется при рефакторинге проекта по другой ошибке компилятора — несоответствие типов. Было int — стало unsigned, вот и результат.
Мелкие недочёты
(style) Unused variable: ent. Это предупреждение умеют выдавать и компиляторы, ничего интересного.
(warning) %d in format string (no. 2) requires 'int' but the argument type is 'DWORD ' — очень популярная ошибка, программисты в printf пишут тип, не соответствующий типу переменной. Это тоже отстреливается большинством компиляторов.
Класс без конструктора:
(performance) Function parameter 'range' should be passed by reference. cppcheck рекомендует передавать параметр по ссылке, чтобы избежать копирования аргумента:
(warning) Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead? Метод empty имеет смысл только внутри условия и не очищает строку. Это ложное срабатывание, cppcheck не подозревал, что автор сделает свой класс String:) Следует проверить логику именования методов.
(style) 'class ByteArray' does not have a copy constructor which is recommended since the class contains a pointer to allocated memory. cppcheck просто рекомендует создать в классе отсутствующий конструктор копирования на случай, если программист забыл его реализовать.
Вывод
Оба анализатора наковыряли приличное количество ошибок, причём многие из них уникальны для каждого анализатора. В целом, было бы неплохо иметь cppcheck под рукой всегда, так как он открыт, кроссплатформенный, реально находит ошибки и помогает улучшать стиль программирования. Использование cppcheck обычно не представляет проблем.
Из этого анализа можно сделать вывод, что инструменты хорошо друг друга дополняют. Для кого-то главным минусом cppcheck является отсутствие плагина под Visual Studio, поэтому авторы cppcheck любезно предлагают попробовать PVS-Studio. Несмотря на интерфейс командной строки, пользоваться cppcheck очень удобно. Не требуется ни компилятора, ни IDE, ни заголовочных файлов — это самый простой в использовании статический анализатор, который я только видел. Кроме того, я специально поставил в виртуальной машине сборку cppcheck для Windows — она имеет приятный графический интерфейс, устанавливается быстро и без проблем выполняет анализ:
Результат анализа можно экспортировать в XML и смотреть в браузере.
Данный анализ можно было бы сильно улучшить, если явно указать cppcheck, где искать заголовочные файлы, какие функции выделяют и освобождают память. Так как статья получилась большой, про то, как настроить cppcheck под конкретный проект, улучшить качество анализа и писать свои правила для cppcheck — в следующий раз.
P. S. Прошу простить одну глупость. Cppcheck имеет в настройках возможность анализировать код специально для Windows, из-за чего очень много интересных ошибок было пропущено. Нужно было анализировать npp с флагом --platform=win32A.
Функция Scanf () и функция scanf_s () в Visual Studio 2019
описание проблемы
error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
Анализ проблем и сравнение функций
функция scanf ()
Функция scanf () - это функция в ANSI C. Она не проверяет границу при чтении, поэтому может вызвать доступ к памяти вне допустимого диапазона. Например, выделяется 5 байтов пространства, но читается 10 байтов, как показано ниже:
Если вы введете 1234567890, 567890 будет записан в другое пространство, что приведет к аварийному запуску программы.
функция scanf_s ()
Чтобы предотвратить «scanf () не проверяет границу при чтении строки, что может вызвать утечку памяти» и привести к ненормальному запуску программы. Начиная с VS2005, Microsoft VS предоставляет функцию scanf_s (). Его функция такая же, как и у исходной функции scanf (), за исключением того, что когда вызывается функция scanf_s (),Необходимо указать число, чтобы указать максимальное количество символов для чтения во избежание переполнения.
Если в приведенном выше коде используется функция scanf_s (), вторая строка должна быть изменена на:
Это означает чтение не более 4 символов, потому что buf [4] должен помещать «\ 0». Последний параметр n функции scanf_s () - это размер буфера, что означает, что можно прочитать не более n-1 символов. При использовании функции scanf_s () для чтения одного символа также необходимо ограничить длину, которая записывается следующим образом.
подводить итоги
Функция scanf () - это исходная функция ввода, а функция scanf_s () - уникальная функция Microsoft VS. Оба имеют одинаковые функции, но последний более безопасен и надежен.
Повторное использование
При программировании на VS напишите в первой строке следующий оператор.
Если вы не хотите вводить оператор в первую строку, вы также можете настроить его в свойствах проекта VS, чтобы функция scanf могла нормально использоваться во всем проекте. Шаги настройки следующие:
- Найдите проект в строке меню → Свойства проекта → C / C ++ → препроцессор
- Справа есть определение препроцессора, добавьте к его параметрам _CRT_SECURE_NO_WARNINGS
3. Если два вышеупомянутых метода по-прежнему вызывают затруднения, существует третий метод. Найдите элемент в строке меню, найдите свойства проекта, найдите C / C ++, найдите генерацию кода, в генерации кода есть проверка безопасности, измените проверку безопасности, чтобы отключить проверку безопасности.
Последние две схемы применимы ко всему проекту, поскольку они изменяют параметры конфигурации проекта. Но этот параметр, естественно, не влияет на другие проекты, поэтому, если необходимо, ту же конфигурацию необходимо выполнить еще раз в других проектах, чтобы они вступили в силу.
Интеллектуальная рекомендация
Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.
Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.
Мяу Пасс Матрица SDUT
Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.
Гессенская легкая двоичная структура удаленного вызова
Hessian - это легкая двоичная структура удаленного вызова, официальный адрес документа, в основном он включает протокол удаленного вызова Hessian, протокол сериализации Hessian, прокси-сервер клиента .
TCP Pasket и распаковка и Нетти Solutions
Основные введение TCP является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.
О предупреждениях и ошибках scanf () на языке C компиляции VS
Возникшие проблемы
Я бегу в VS, содержащий scanf() Предупреждение C6031 и ошибка C4996 возникли во время программы C.
error C4996: ‘scanf’: This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT
Предупреждение C6031: возвращаемое значение игнорируется: может быть возвращено непредвиденное значение
Это мой код для проверки четности
Грамматика и формулировка правильные.
Потом много искал в Интернете и нашел удобное, полезное и основательное решение:
В верхней левой строке менюпроект--ВыбратьАтрибуты——C/C++--ВыбратьПредварительная обработка——Щелкнитередактировать-Добавить _CRT_SECURE_NO_WARNINGS
Интеллектуальная рекомендация
Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом для чтения.
Michael.W Поговорите о Hyperledger Fabric. Проблема 20 - Подробная индивидуальная сортировка узла с пятью порядками с исходным кодом чтения Fabric Файл исходного кода одиночного режима находится в ord.
Мяу Пасс Матрица SDUT
Мяу Пасс Матрица SDUT Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description Лянцзян получил матрицу, но эта матрица была особенно уродливой, и Лянцзян испытал отвращение. Чт.
Гессенская легкая двоичная структура удаленного вызова
Hessian - это легкая двоичная структура удаленного вызова, официальный адрес документа, в основном он включает протокол удаленного вызова Hessian, протокол сериализации Hessian, прокси-сервер клиента .
TCP Pasket и распаковка и Нетти Solutions
Основные введение TCP является ориентированным на соединение, обеспечивая высокую надежность услуг. На обоих концах (клиенты и терминалы сервера) должны иметь один или более гнезда, так что передающий.
Читайте также: