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

У меня возникают вопросы , получить С Sockets API для работы должным образом 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

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

1.08.2008 12:13:50
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

ФОРМАТ

X / Open

#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);
86
28.01.2013 03:45:42

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

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

38
1.08.2008 12:22:40

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

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

32
27.11.2012 06:19:12

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

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

26
28.01.2013 03:45:01
z / OS имеет столько же общего с z / VM, сколько Windows с Linux, поэтому я немного удивлен, почему вы опубликовали эту ссылку.
paxdiablo 26.02.2009 09:14:30
Обратите внимание, что макрос _OE_SOCKETS появляется в обоих случаях и, похоже, имеет одну и ту же цель. Что неудивительно, поскольку, вероятно, IBM использовала одинаковую кодовую базу для поддержки сокетов в обоих продуктах. Я не собирался говорить, что документация z / VM относится к z / OS, это просто самый похожий случай, который я нашел.
Fabio Ceconello 6.06.2009 00:09:38
Я думаю, что это просто совпадение. z / VM не использует продукт z / OS Language Environment, который предоставляет соответствующие файлы заголовков, используемые для вызовов сокетов.
Anthony Giorgio 18.09.2009 11:19:28

Так что постарайтесь

#define _OE_SOCKETS

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

25
21.09.2008 12:37:01

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

19
7.09.2008 08:21:50

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

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

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

18
1.08.2008 13:54:25

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не программист 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;
}
14
29.08.2008 18:56:19
Это не имеет ничего общего с первоначальным вопросом.
Anthony Giorgio 18.09.2009 11:25:41

Ответ - используйте флаг c89, который следует:

 -D_OE_SOCKETS

Пример следует;

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

Для получения дополнительной информации см. Параметры C89 в Руководстве пользователя z / OS XLC / C ++.

13
11.04.2011 18:59:23