Jak używać gniazda C API w C ++ na z / OS

głosy
126

Byłem problemy uzyskiwanie C gniazd API do prawidłowej pracy w C ++. W szczególności, choć nie jestem tym sys/socket.h, wciąż otrzymuję błędy kompilacji czas mówi mi, że AF_INETnie jest zdefiniowana. Jestem brakuje czegoś oczywiste, czy może to być związane z faktem, że robię to na kodowanie z/OSi moje problemy są dużo bardziej skomplikowane?


Aktualizacja : Po dalszych badaniach odkryłem, że istnieje #ifdef, że mam trafienia. Najwyraźniej z/OSnie jest zadowolony chyba określić, które „typ” gniazd używam z:

#define _OE_SOCKETS

Teraz, ja osobiście nie mam pojęcia co to _OE_SOCKETSjest rzeczywiście za, więc jeśli jakieś z/OSgniazda programiści są tam (wszystkie 3 z was), być może dasz mi wybiegiem, jak to wszystko działa?


Pewien, że mogę umieścić aplikację testową.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Wyjście kompilacji / link:

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

„./inet.C”, wiersz 5.16: CCN5274 (S) Nazwa odnośnika dla «AF_INET» nie znaleźliśmy oświadczenie.

CCN0797 (I) Kompilacja nie powiodła się dla plików ./inet.C. Obiekt nie został utworzony plik.

Sprawdzenie sys / sockets.h nie zawiera definicji muszę, io ile mogę powiedzieć, że nie jest blokowany przez #ifdef jakichkolwiek oświadczeń.

Ja jednak zauważyłem, że zawiera następujące elementy:

#ifdef __cplusplus
  extern C {
#endif

który łączy w zasadzie cały plik. Nie wiem, czy to ma znaczenie.

Utwórz 01/08/2008 o 13:13
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
71

Zachowaj kopię IBM podręczników przydatnych:

IBM publikacje są na ogół bardzo dobre, ale trzeba się przyzwyczaić do ich formatu, a także wiedząc, gdzie szukać odpowiedzi. Znajdziesz dość często, że funkcja, którą chcesz użyć jest strzeżone przez „funkcji testowej makro”

Należy zwrócić się do przyjaznego programista systemowy, aby zainstalować XL C / C ++ Run-Time Library Reference: Mężczyzny stron w systemie. Następnie można zrobić takie rzeczy jak „człowiek połączyć” podciągnąć stronę podręcznika dla gnieździe connect () API. Kiedy to zrobić, to jest to, co widzę:

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);
Odpowiedział 18/09/2009 o 12:17
źródło użytkownik

głosy
34

Miałem żadnych problemów przy użyciu gniazdek BSD API w C ++ w systemie GNU / Linux. Oto przykładowy program użyłem:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Więc moje zdanie w tej sprawie jest to, że z / OS jest prawdopodobnie czynnikiem komplikującym tutaj jednak, ponieważ nigdy nie używałem z / OS wcześniej, znacznie mniej zaprogramowany w nim, nie mogę powiedzieć, że to definitywnie. :-P

Odpowiedział 01/08/2008 o 13:22
źródło użytkownik

głosy
29

Patrz Korzystanie z / OS UNIX System Services gniazda sekcji w systemie z / OS XL C / C ++ Programming Guide. Upewnij się, że jesteś w tym niezbędne pliki nagłówkowe i stosując odpowiednie #defines.

Link do dokumentu zmienił się na przestrzeni lat, ale powinieneś być w stanie dostać się do niego dość łatwo poprzez znalezienie aktualnego położenia sekcji Wsparcie i na ibm.com i przeszukiwania dokumentacji tytuł.

Odpowiedział 15/05/2009 o 06:27
źródło użytkownik

głosy
23

_OE_SOCKETS wydaje się, że wystarczy, aby włączać / wyłączać definicji symboli gniazdach. Nie jest rzadkością w niektórych bibliotekach mieć kilka makr, aby to zrobić, aby zapewnić, że nie jesteś kompilowania / łączenie części nie są potrzebne. Makro nie jest standardem w innych implementacjach gniazd, wydaje się być czymś specyficzne dla systemu z / OS.

Spójrz na tej stronie:
Kompilacja i łączenie AZ / VM C Gniazda Program

Odpowiedział 11/10/2008 o 01:38
źródło użytkownik

głosy
23

Więc spróbuj

#define _OE_SOCKETS

Zanim to sys / socket.h

Odpowiedział 21/09/2008 o 13:37
źródło użytkownik

głosy
17

Może warto spojrzeć na CPP-gniazd , C ++ wrapper dla wywołań systemowych gniazda. Współpracuje z wieloma systemami operacyjnymi (Win32, POSIX, Linux, * BSD). Nie sądzę, że będzie działać w systemie z / OS, ale można spojrzeć na include plików używa i będziesz mieć wiele przykładów testowanego kodu, który działa dobrze na innych systemach operacyjnych.

Odpowiedział 07/09/2008 o 09:21
źródło użytkownik

głosy
15

@Jax: Te extern "C"kwestie rzecz, bardzo dużo. Jeśli plik nagłówka nie ma jednego, to (chyba że jest to C ++ - tylko plik nagłówka), trzeba by ująć #includew nim:

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

W zasadzie w każdej chwili, gdy program C ++ chce odwołuje się do obiektów C-owskich extern "C"jest niezbędna. W praktyce oznacza to, że nazwy stosowane w odnośnikach zewnętrznych nie będą zniekształcone, jak normalne C ++ nazw będzie. Odniesienie.

Odpowiedział 01/08/2008 o 14:40
źródło użytkownik

głosy
11

Odpowiedź jest użyć flagi C89, który następuje:

 -D_OE_SOCKETS

Przykład podany jest poniżej;

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

Aby uzyskać więcej informacji, poszukaj opcji C89 w podręczniku z / OS XLC / C ++ użytkownika.

Odpowiedział 11/04/2011 o 19:59
źródło użytkownik

głosy
11

OŚWIADCZENIE: Ja nie programista C ++, jednak wiem, C bardzo dobrze. I adapated tych połączeń z niektórych kodu C mam.

Przecena również umieścić te dziwne _ jak moje podkreślenia.

Trzeba tylko umieć napisać klasę abstrakcji wokół gniazd C z czymś takim:

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;
};

Wtedy sposoby otwierania, zamykania, i wysyłają pakiety dół gniazda.

Na przykład, otwarta rozmowa może wyglądać następująco:

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;
}
Odpowiedział 29/08/2008 o 19:56
źródło użytkownik

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