Как использовать API сокета C в C++ на z / OS

У меня возникают проблемы с правильной работой API сокетов C в C++ на z / OS.

Хотя я включаю sys/socket.h, я все равно получаю ошибки времени компиляции, сообщающие мне, что AF_INET не определен.

Я упускаю что-то очевидное, или это связано с тем, что использование z / OS значительно усложняет мои проблемы?

Я обнаружил, что у меня есть #ifdef. Очевидно, z / OS недовольна, если я не определю, с каким «типом» сокетов я использую:

#define _OE_SOCKETS

Я лично понятия не имею, для чего на самом деле предназначен этот _OE_SOCKETS, поэтому, если есть программисты сокетов z / OS (все трое), возможно, вы могли бы дать мне краткое изложение того, как все это работает?

Тестовое приложение

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Компиляция / компоновка вывода:

cxx -Wc,xplink -Wl,xplink -o inet_test inet.C

"./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration.
CCN0797(I) Compilation failed for file ./inet.C. Object file not created.

Проверка sys / sockets.h действительно включает нужное мне определение, и, насколько я могу судить, оно не блокируется никакими операторами #ifdef.

Однако я заметил, что он содержит следующее:

#ifdef __cplusplus
  extern "C" {
#endif

который инкапсулирует в основном весь файл? Не уверен, имеет ли это значение.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
166
0
14 072
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

У меня не было проблем с использованием API сокетов BSD на C++ в GNU / Linux. Вот пример программы, которую я использовал:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Итак, я считаю, что z / OS, вероятно, является здесь усложняющим фактором, однако, поскольку я никогда раньше не использовал z / OS, не говоря уже о программировании в ней, я не могу сказать об этом окончательно. :-П

@Jax: extern "C" имеет большое значение. Если в файле заголовка его нет, тогда (если это не файл заголовка, предназначенный только для C++), вам придется приложить к нему свой #include:

extern "C" {
#include <sys/socket.h>
// include other similarly non-compliant header files
}

По сути, в любое время, когда программа на C++ хочет подключиться к средствам на основе C, extern "C" жизненно важен. На практике это означает, что имена, используемые во внешних ссылках, не будут искажены, как обычные имена C++. Ссылка.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не программист на C++, но я очень хорошо знаю C. я адаптировал эти вызовы из имеющегося у меня кода C.

Также уценка поместила эти странные _ в качестве подчеркивания.

Вы должны просто написать класс абстракции вокруг сокетов C примерно так:

class my_sock {
    private int sock;
    private int socket_type;
    private socklen_t sock_len;
    private struct sockaddr_in server_addr;
    public char *server_ip;
    public unsigned short server_port;
};

Затем есть методы для открытия, закрытия и отправки пакетов по сокету.

Например, открытый вызов может выглядеть примерно так:

int my_socket_connect()
{
    int return_code = 0;

    if ( this->socket_type != CLIENT_SOCK ) {
        cout << "This is a not a client socket!\n";
        return -1;
    }

    return_code = connect( this->local_sock, (struct sockaddr *) &this->server_addr, sizeof(this->server_addr));

    if ( return_code < 0 ) {
        cout << "Connect() failure! %s\n", strerror(errno);
        return return_code;
    }

    return return_code;
}

Это не имеет ничего общего с исходным вопросом.

Anthony Giorgio 18.09.2009 15:25

Вы можете взглянуть на cpp-сокеты, оболочку C++ для системных вызовов сокетов. Он работает со многими операционными системами (Win32, POSIX, Linux, * BSD). Я не думаю, что он будет работать с z / OS, но вы можете взглянуть на включаемые файлы, которые он использует, и у вас будет много примеров протестированного кода, который хорошо работает в других ОС.

Поэтому постарайтесь

#define _OE_SOCKETS

перед включением sys / socket.h

_OE_SOCKETS, похоже, просто позволяет включить / отключить определение символов, связанных с сокетами. В некоторых библиотеках нередко есть набор макросов для этого, чтобы гарантировать, что вы не компилируете / компилируете ненужные части. Макрос не является стандартным для других реализаций сокетов, кажется, что он специфичен для z / OS.

Взгляните на эту страницу:
Компиляция и компоновка программы сокетов z / VM C

z / OS имеет столько же общего с z / VM, как Windows и Linux, поэтому я немного озадачен, почему вы разместили эту ссылку.

paxdiablo 26.02.2009 12:14

Обратите внимание, что макрос _OE_SOCKETS появляется в обоих и, похоже, имеет одну и ту же цель. Что неудивительно, поскольку, вероятно, IBM использовала одну и ту же кодовую базу для поддержки сокетов в обоих продуктах. Я не собирался говорить, что документация z / VM применима к z / OS, это просто самый похожий случай, который я обнаружил.

Fabio Ceconello 06.06.2009 04:09

Думаю, это просто совпадение. z / VM не использует продукт z / OS Language Environment, который предоставляет соответствующие файлы заголовков, используемые для вызовов сокетов.

Anthony Giorgio 18.09.2009 15:19

См. Раздел Использование сокетов системных служб z / OS UNIX в Руководстве по программированию z / OS XL C / C++. Убедитесь, что вы включаете необходимые файлы заголовков и используете соответствующие #defines.

Ссылка на документ менялась с годами, но вы сможете легко добраться до него, найдя текущее местоположение Раздел поддержки и загрузки на ibm.com и выполнив поиск в документации по заголовку.

Ответ принят как подходящий

Держите под рукой копии руководств IBM:

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

Вы должны попросить своего дружелюбного системного программиста установить Справочник по библиотеке времени выполнения XL C / C++: Man Pages в вашу систему. Затем вы можете сделать что-то вроде "man connect", чтобы открыть страницу руководства по API-интерфейсу socket (). Когда я это делаю, я вижу следующее:

ФОРМАТ

X / Открыть

#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);

Розетки Беркли

#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

int connect(int socket, struct sockaddr *address, int address_len);

Используйте следующий флаг c89:

 -D_OE_SOCKETS

Пример:

 bash-2.03$ c89 -D_OE_SOCKETS [filename].c

Дополнительные сведения см. В разделе «Параметры c89» в Руководстве пользователя z / OS XLC / C++.

Другие вопросы по теме