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

голоса
126

У меня возникли проблемы , приобретающие C розетки API для правильной работы в C ++. В частности, хотя я в том числе sys/socket.h, я все еще получаю ошибки компиляции время говорят мне , что AF_INETне определен. Я пропускаю что - то очевидное, или это могло быть связано с тем , что я делаю это кодирование на z/OSи мои проблемы являются гораздо более сложными?


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

#define _OE_SOCKETS

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


Конечно, я могу отправить тестовое приложение.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Компиляция / Link Выход:

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

«./inet.C», линия 5,16: CCN5274 (S) Название поиск для „AF_INET“ не нашел декларацию.

CCN0797 (I) Компиляция Сбой файла ./inet.C. Объектный файл не создается.

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

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

#ifdef __cplusplus
  extern C {
#endif

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

Задан 01/08/2008 в 13:13
источник пользователем
На других языках...                            


9 ответов

голоса
34

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

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

Ответил 01/08/2008 в 13:22
источник пользователем

голоса
15

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

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

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

Ответил 01/08/2008 в 14:40
источник пользователем

голоса
11

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не программист 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;
}
Ответил 29/08/2008 в 19:56
источник пользователем

голоса
17

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

Ответил 07/09/2008 в 09:21
источник пользователем

голоса
23

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

#define _OE_SOCKETS

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

Ответил 21/09/2008 в 13:37
источник пользователем

голоса
23

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

Посмотрите на этой странице:
Компиляция и компоновка аза / Розетка Программа VM C

Ответил 11/10/2008 в 01:38
источник пользователем

голоса
29

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

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

Ответил 15/05/2009 в 06:27
источник пользователем

голоса
71

Храните копии руководств IBM удобные:

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

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

ФОРМАТ

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);
Ответил 18/09/2009 в 12:17
источник пользователем

голоса
11

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

 -D_OE_SOCKETS

Пример следующим образом;

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

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

Ответил 11/04/2011 в 19:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more