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

def clamp(n, minn, maxn):
    return max(min(maxn, n), minn)

или функционально эквивалентны:

clamp = lambda n, minn, maxn: max(min(maxn, n), minn)

теперь вы используете:

n = clamp(n, 7, 42)

или совершенно ясно:

n = minn if n < minn else maxn if n > maxn else n

еще четче:

def clamp(n, minn, maxn):
    if n < minn:
        return minn
    elif n > maxn:
        return maxn
    else:
        return n
141
задан Jax 22 August 2018 в 16:02
поделиться

8 ответов

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

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

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

FORMAT

X / Open

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

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

Berkeley Sockets

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

int connect(int socket, struct sockaddr *address, int address_len);
82
ответ дан 23 November 2019 в 22:43
поделиться

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

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

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

17
ответ дан Chris Jester-Young 22 August 2018 в 16:02
поделиться

ПРАВОВАЯ ОГОВОРКА: Я не программист на C++, однако я знаю C действительно хорошо. Я adapated, который кодируют эти вызовы от некоторого 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;
}
13
ответ дан David Bryson 22 August 2018 в 16:02
поделиться

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

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

37
ответ дан Chris Jester-Young 22 August 2018 в 16:02
поделиться

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

19
ответ дан Federico 22 August 2018 в 16:02
поделиться

Так попытка

#define _OE_SOCKETS

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

25
ответ дан fizzer 22 August 2018 в 16:02
поделиться

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

Смотрят на эту страницу:
Компиляция и Соединение z/VM C Программа

Сокетов
25
ответ дан Fabio Ceconello 22 August 2018 в 16:02
поделиться

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

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

31
ответ дан 23 November 2019 в 22:43
поделиться