Πώς να χρησιμοποιήσετε το API υποδοχή C σε C ++ σε z / 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;
}

Συντάξτε / Σύνδεση εξόδου:

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

«./Inet.C», γραμμή 5.16: CCN5274 (S) Το όνομα αναζήτηση για “AF_INET” δεν βρει μια δήλωση.

CCN0797 (Ι) Σύνταξη απέτυχε για ./inet.C αρχείο. αρχείο αντικείμενο δεν δημιουργείται.

Ο έλεγχος των sys / sockets.h δεν περιλαμβάνει τον ορισμό που χρειάζομαι, και στο βαθμό που μπορώ να πω, δεν εμποδίζεται από τυχόν #ifdef καταστάσεις.

Έχω όμως παρατηρήσει ότι περιέχει τα εξής:

#ifdef __cplusplus
  extern C {
#endif

η οποία συμπυκνώνει ουσιαστικά ολόκληρο το αρχείο. Δεν είμαι σίγουρος αν έχει σημασία.

Δημοσιεύθηκε 01/08/2008 στις 13:13
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
71

Κρατήστε ένα αντίγραφο των εγχειριδίων IBM πρακτικό:

Οι εκδόσεις της IBM είναι γενικά πολύ καλή, αλλά θα πρέπει να συνηθίσουν σε μορφή τους, καθώς και να γνωρίζουν πού να ψάξουν για μια απάντηση. Θα βρείτε αρκετά συχνά ότι ένα χαρακτηριστικό που θέλετε να χρησιμοποιήσετε φρουρείται από μια «μακρο δοκιμή χαρακτηριστικό»

Θα πρέπει να ρωτήσετε φιλικό προγραμματιστής του συστήματός σας να εγκαταστήσει το XL C / C ++ χρόνου εκτέλεσης Βιβλιοθήκη αναφοράς: Ο άνθρωπος σελίδες στο σύστημά σας. Στη συνέχεια, μπορείτε να κάνετε τα πράγματα όπως «ο άνθρωπος συνδεθείτε» για να σηκώσει τη σελίδα 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 Πρίζες

#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
πηγή χρήστη

ψήφοι
34

Είχα κανένα πρόβλημα με τη χρήση του API υποδοχές BSD σε C ++, το GNU / Linux. Εδώ είναι το πρόγραμμα του δείγματος που χρησιμοποιήθηκε:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Έτσι, να μου σχετικά με αυτό είναι ότι z / OS είναι ίσως ο παράγοντας που περιπλέκει εδώ, όμως, γιατί ποτέ δεν έχω χρησιμοποιήσει z / OS πριν, πολύ λιγότερο προγραμματιστεί σε αυτό, δεν μπορώ να το πω αυτό οριστικά. :-Π

Απαντήθηκε 01/08/2008 στις 13:22
πηγή χρήστη

ψήφοι
29

Δείτε το Χρησιμοποιώντας z / OS UNIX System Services υποδοχές ενότητα στο z / OS XL C / C ++ Οδηγός προγραμματισμού. Βεβαιωθείτε ότι είστε συμπεριλαμβανομένων των απαραίτητων αρχείων κεφαλίδας και χρησιμοποιώντας τα κατάλληλα #defines.

Η σύνδεση με το έγγραφο έχει αλλάξει με την πάροδο των χρόνων, αλλά θα πρέπει να είναι σε θέση να πάρει σε αυτό αρκετά εύκολα με την εύρεση την τρέχουσα θέση του τμήματος Υποστήριξης & Λήψεις για ibm.com και την αναζήτηση της τεκμηρίωσης από τον τίτλο.

Απαντήθηκε 15/05/2009 στις 06:27
πηγή χρήστη

ψήφοι
23

Η _OE_SOCKETS φαίνεται να είναι απλά για να ενεργοποιήσετε / απενεργοποιήσετε τον ορισμό των συμβόλων υποδοχή που σχετίζονται με. Δεν είναι ασυνήθιστο σε ορισμένες βιβλιοθήκες να έχουν μια δέσμη των μακροεντολών για να το κάνουμε αυτό, για να εξασφαλιστεί ότι δεν είστε κατάρτιση / συνδέοντας τμήματα δεν χρειάζονται. Η μακρο δεν είναι στάνταρ σε άλλες πρίζες υλοποιήσεις, φαίνεται να είναι κάτι συγκεκριμένο στο z / OS.

Ρίξτε μια ματιά σε αυτή τη σελίδα:
Συγκέντρωση και σύνδεση az / VM C Πρόγραμμα Πρίζες

Απαντήθηκε 11/10/2008 στις 01:38
πηγή χρήστη

ψήφοι
23

Έτσι προσπαθούν

#define _OE_SOCKETS

πριν περιλαμβάνουν sys / socket.h

Απαντήθηκε 21/09/2008 στις 13:37
πηγή χρήστη

ψήφοι
17

Μπορεί να θέλετε να ρίξετε μια ματιά στο CPP-υποδοχές , ένα C ++ περιτύλιγμα για τις κλήσεις υποδοχές συστήματος. Λειτουργεί με πολλά λειτουργικά συστήματα (Win32, POSIX, το Linux, * BSD). Δεν νομίζω ότι θα συνεργαστεί με z / OS, αλλά μπορείτε να ρίξετε μια ματιά στο περιλαμβάνουν τα αρχεία που χρησιμοποιεί και θα έχετε πολλά παραδείγματα δοκιμαστεί κώδικα που λειτουργεί καλά σε άλλα λειτουργικά συστήματα.

Απαντήθηκε 07/09/2008 στις 09:21
πηγή χρήστη

ψήφοι
15

@Jax: Τα extern "C"θέματα πράγμα, πολύ πολύ πολύ. Εάν ένα αρχείο κεφαλίδας δεν έχει ένα, τότε (αν δεν είναι σε C ++ - μόνο το αρχείο header), θα πρέπει να επισυνάψουν σας #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

Η απάντηση είναι να χρησιμοποιήσετε τη σημαία C89 που ακολουθεί:

 -D_OE_SOCKETS

Παράδειγμα εξής?

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

Για περισσότερες πληροφορίες αναζητήστε Επιλογές C89 στον Οδηγό χρήσης του z / OS XLC / C ++.

Απαντήθηκε 11/04/2011 στις 19:59
πηγή χρήστη

ψήφοι
11

ΑΠΟΠΟΙΗΣΗ: Δεν είμαι προγραμματιστής C ++, όμως ξέρω C πολύ καλά. Έχω adapated αυτές τις κλήσεις από κάποιο κώδικα C που έχω.

Επίσης Markdown θέσει αυτά τα περίεργα _ όπως υπογράμμισης μου.

Θα πρέπει απλώς να είναι σε θέση να γράψει μια τάξη αφαίρεση γύρω από τις υποδοχές 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
πηγή χρήστη

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