Nasıl z / OS üzerinde C ++ C yuva API kullanma

oy
126

Ben ++ C yuva API C düzgün çalışması için alma sorunları yaşıyorum. Dahil ediyorum rağmen Özellikle, sys/socket.hhala bana zaman derleme hatası alıyorsunuz AF_INETtanımlı değil. Ben belirgin bir şey eksik veya bu ben bu kodlama yapıyorum gerçeği ile ilgili olabilir z/OSve sorunlarım çok daha karmaşıktır?


Güncelleme : Araştırmamız sonucunda, bir olduğunu keşfetti #ifdefben vuruyorum o. Anlaşılan z/OSben birlikte kullanıyorum soketlerinin hangi tip define sürece mutlu değil:

#define _OE_SOCKETS

Şimdi, ben şahsen bu hiçbir fikrim yok _OE_SOCKETSaslında, yani eğer varsa z/OSprizler programcıları orada (hepiniz 3) vardır, belki de bana bu nasıl çalıştığına ilişkin bir özet verebilir?


Tabii bir test uygulamasının gönderebilir.

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

/ Bağlantı Çıktı derleme:

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

./inet.C, hat 5.16: CCN5274 (S) 'AF_INET' için ad arama bir deklarasyon bulamadık.

CCN0797 (I) Derleme dosya ./inet.C için başarısız oldu. Nesne dosyası oluşturulmaz.

sys / sockets.h bir onay ihtiyacım tanımını ve bildiğim kadarıyla söyleyebilirim, herhangi #Ifdef ifadeler tarafından bloke edilmediğinden içermemektedir.

Ben ancak bir aşağıdakileri içerir fark etmiş:

#ifdef __cplusplus
  extern C {
#endif

hangi temelde tüm dosyayı kapsüller. bu konularda emin değilim.

Oluştur 01/08/2008 saat 13:13
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
71

Kullanışlı IBM kılavuzları bir kopyasını saklayın:

IBM yayınları genellikle çok iyi, ama siz de nerede bir cevap aramaya bilerek gibi kendi formatına alışması gerekiyor. Bir "özelliği testi makro" tarafından oldukça sık kullanmak istediğiniz bir özellik korunuyor olduğunu göreceksiniz

Sen yüklemek için dost sistem programcısı sormalısınız Man Sayfaları: XL C / C ++ çalışma zamanı kitaplığı Başvurusu sisteminizde. Sonra) (gibi şeyler bağlamak soket man sayfasını yukarı çekmek için "insan bağlamak" API yapabilirsiniz. Bunu yaparken, bu gördüğüm budur:

BİÇİM

X / Open

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

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

Berkeley Yuva

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

int connect(int socket, struct sockaddr *address, int address_len);
Cevap 18/09/2009 saat 12:17
kaynak kullanıcı

oy
34

Ben GNU / Linux C ++ BSD soketleri API kullanarak hiçbir sorun yaşadım. İşte kullanılan örnek program:

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Ben çok daha az içinde programlanmış, daha önce z / OS hiç kullanmadım çünkü Yani bu almak benim o z / OS, ancak, muhtemelen burada komplikasyon faktörü olduğunu, kesinlikle bu söyleyemem. :-P

Cevap 01/08/2008 saat 13:22
kaynak kullanıcı

oy
29

Bkz kullanma z / OS UNIX Sistem Hizmetleri prizleri z / OS XL C / C ++ programlama Kılavuzu'nda bölüm. Gerekli başlık dosyaları da dahil olmak ve uygun #DEFINEs kullandığınızdan emin olun.

Dokümanın bağlantısı yıllar içinde değişti, ancak geçerli konumunu bularak kolayca yeterince bunu almak mümkün olmalıdır Destek ve Yüklemeler bölümünde üzerinde ibm.com ve başlığa göre belgelerine arama.

Cevap 15/05/2009 saat 06:27
kaynak kullanıcı

oy
23

_OE_SOCKETS yalnızca yuva ile ilişkili sembollerin tanımı / devre dışı bırakmak gibi görünmektedir. Bazı kütüphaneler gerekli değildir taraflarını birbirine bağlayan / sen derleme değiliz emin olmak için, bunu yapmak için makro bir demet sahip olmak çok nadir değildir. Makro diğer prizleri uygulamalarda standart değil, z / OS özgü bir şey gibi görünüyor.

Bu sayfaya göz atın:
Derleme ve az'yi Bağlama / VM C Yuva Programı

Cevap 11/10/2008 saat 01:38
kaynak kullanıcı

oy
23

O zaman dene

#define _OE_SOCKETS

Eğer sys dahil önce / socket.h

Cevap 21/09/2008 saat 13:37
kaynak kullanıcı

oy
17

Sen bir göz atmak isteyebilirsiniz cpp-priz prizler sistem çağrıları için ++ sarıcı, bir C. Birçok işletim sistemleri (Win32, POSIX'e, Linux, * BSD) ile çalışır. Ben z / OS ile çalışacak sanmıyorum ama kullandığı ve diğer işletim sisteminde iyi çalışır test kod pek çok örnek olacak dosyaları dahil en Eğer bir göz atabilirsiniz.

Cevap 07/09/2008 saat 09:21
kaynak kullanıcı

oy
15

@Jax: extern "C"şey önemli, çok çok fazla. Bir başlık dosyası (bir C ++ olmadıkça - Sadece başlık dosyası) sonra bir tane, yoksa, size içine olurdu #includeonunla:

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

Temel olarak, bir C ++ programı C tabanlı tesislerine bağlantı oluşturmak istiyor zaman, extern "C"hayati önem taşımaktadır. Pratik açıdan bakıldığında, dış referanslar kullanılan isimler olur, normal C ++ isimleri gibi, cendereleneceğini anlamına gelir. Referans.

Cevap 01/08/2008 saat 14:40
kaynak kullanıcı

oy
11

Cevap şu C89 bayrağı kullanmaktır:

 -D_OE_SOCKETS

Örnek, aşağıdaki;

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

Daha fazla bilgi için z / OS XLC / C ++ Kullanıcı Kılavuzu'nda C89 Options arayın.

Cevap 11/04/2011 saat 19:59
kaynak kullanıcı

oy
11

YASAL UYARI: Ben ancak ben gerçekten iyi C'yi biliyorum, bir C ++ programcısı değilim. Ben var bazı C kodundan bu çağrıları adapated.

Ayrıca benim çizgi olarak _ bu garip koymak markdown.

Sadece böyle bir şey ile C soketi etrafında bir soyutlama sınıf yazmak gerekir:

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

Sonra açılması için yöntemler, kapanış ve soket aşağı paketleri göndererek var.

Örneğin, açık çağrı aşağıdaki gibi görünebilir:

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;
}
Cevap 29/08/2008 saat 19:56
kaynak kullanıcı

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