Mam problemy uzyskiwanie c gniazd API do pracy odpowiednio w C++
dniu z/OS
.
Chociaż włączam sys/socket.h
, nadal pojawiają się błędy czasu kompilacji, które mówią mi, że AF_INET
nie jest zdefiniowane .
Czy brakuje mi czegoś oczywistego, czy jest to związane z faktem, że bycie na z/OS
łóżku znacznie komplikuje moje problemy?
Aktualizacja : Po dalszym dochodzeniu odkryłem, że jest coś #ifdef
, co uderzam. Najwyraźniej z/OS
nie jest zadowolony, chyba że zdefiniuję z jakim „typem” gniazdek korzystam:
#define _OE_SOCKETS
Osobiście nie mam pojęcia, do czego to _OE_SOCKETS
właściwie służy, więc jeśli z/OS
są tam jacyś programiści gniazd (wszyscy trzej), może moglibyście dać mi podsumowanie, jak to wszystko działa?
Aplikacja testowa
#include <sys/socket.h>
int main()
{
return AF_INET;
}
Kompilacja / łącze wyjściowe:
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.
Sprawdzenie sys / sockets.h zawiera definicję, której potrzebuję, i o ile wiem, nie jest ona blokowana przez żadne #ifdef
instrukcje.
Zauważyłem jednak, że zawiera:
#ifdef __cplusplus
extern "C" {
#endif
która zawiera w zasadzie cały plik? Nie jestem pewien, czy to ma znaczenie.
Więc spróbuj
przed dołączeniem sys / socket.h
źródło
Możesz rzucić okiem na cpp-sockets , opakowanie C ++ dla wywołań systemowych gniazd. Działa z wieloma systemami operacyjnymi (Win32, POSIX, Linux, * BSD). Nie sądzę, że będzie działać z systemem z / OS, ale możesz przyjrzeć się plikom dołączanym, których używa, i będziesz mieć wiele przykładów przetestowanego kodu, który działa dobrze w innych systemach operacyjnych.
źródło
@Jax: Ta
extern "C"
sprawa ma bardzo duże znaczenie. Jeśli plik nagłówkowy go nie ma, to (chyba że jest to plik nagłówkowy tylko w C ++), musiałbyś go nim załączyć#include
:Zasadniczo zawsze, gdy program C ++ chce łączyć się z obiektami opartymi na języku C,
extern "C"
jest to niezbędne. W praktyce oznacza to, że nazwy używane w odnośnikach zewnętrznych nie zostaną zniekształcone, tak jak normalne nazwy w C ++. Odniesienie.źródło
ZRZECZENIE SIĘ: Nie jestem programistą C ++, ale znam go naprawdę dobrze. Dostosowałem te wywołania z jakiegoś kodu C.
Również markdown umieścił te dziwne _ jako moje podkreślenia.
Powinieneś być w stanie napisać klasę abstrakcji wokół gniazd C za pomocą czegoś takiego:
Następnie przygotuj metody otwierania, zamykania i wysyłania pakietów przez gniazdo.
Na przykład otwarte zaproszenie może wyglądać mniej więcej tak:
źródło
Odpowiedź brzmi: użyj flagi c89, która jest następująca:
Oto przykład;
Aby uzyskać więcej informacji, poszukaj opcji C89 w podręczniku użytkownika z / OS XLC / C ++.
źródło