Z soketinde C ++ API'sini kullanma


158

C++Üzerinde düzgün çalışması için C yuva API alma sorunları yaşıyorum z/OS.

Ben dahil olmasına rağmen sys/socket.h, hala tanımlı olmadığını söyleyen derleme zamanı hataları alıyorum .AF_INET

Açık bir şey mi kaçırıyorum, yoksa bu, z/OSsorunumun daha karmaşık hale gelmesi ile mi ilgili?


Güncelleme : Daha fazla araştırma yapıldığında, #ifdefvurduğum bir şey olduğunu keşfettim . Birlikte z/OSkullandığım soketlerin "tipini" tanımlayana kadar mutlu değiller:

#define _OE_SOCKETS

Şimdi, kişisel olarak bunun ne için olduğu hakkında hiçbir fikrim yok _OE_SOCKETS, bu yüzden eğer herhangi bir z/OSsoket programcısı dışarıdaysa (3ünüz), belki de bana bunların nasıl çalıştığına dair bir özet verebilir misiniz?


Test Uygulaması

#include <sys/socket.h>

int main()
{
    return AF_INET;
}

Derleme / Bağlantı Çıktısı:

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.

Sys / sockets.h denetimi, ihtiyacım olan tanımı içerir ve anlayabildiğim kadarıyla, herhangi bir #ifdefifade tarafından engellenmez .

Ancak aşağıdakileri içerdiğini fark ettim:

#ifdef __cplusplus
  extern "C" {
#endif

hangi temelde tüm dosyayı içine alır? Önemli olup olmadığından emin değilim.

Yanıtlar:


86

IBM kılavuzlarının bir kopyasını el altında bulundurun:

IBM yayınları genellikle çok iyidir, ancak bir yanıtı nerede arayacağınızı bilmenin yanı sıra biçimlerine alışmanız gerekir. Sıklıkla kullanmak istediğiniz bir özelliğin bir "özellik test makrosu" tarafından korunduğunu göreceksiniz

Güleryüzlü sistem programcısından XL C / C ++ Çalışma Zamanı Kütüphanesi Referansı: Man Pages'ı sisteminize kurmasını istemelisiniz . Sonra soket connect () API için man sayfasını yukarı çekmek için "man connect" gibi şeyler yapabilirsiniz. Bunu yaptığımda şunu görüyorum:

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 Soketleri

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

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

38

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

#include <sys/socket.h>

int
main()
{
    return AF_INET;
}

Yani benim bu konuda z / OS muhtemelen burada karmaşık bir faktör, ancak, daha önce hiç z / OS kullanmadım, daha az programlanmış, bunu kesin olarak söyleyemem. :-P


32

Bkz kullanma z / OS UNIX Sistem Hizmetleri prizler z / OS XL C / C ++ Programlama Kılavuzu bölümüne. Gerekli başlık dosyalarını eklediğinizden ve uygun # tanımları 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.


26

_OE_SOCKETS, soketle ilgili sembollerin tanımını etkinleştirmek / devre dışı bırakmak gibi görünüyor. Bazı kütüphanelerde bunu yapmak için gerekli olmayan bir grup makroya sahip olmanız, gerekli olmayan parçaları derlemediğinizden / bağlamadığınızdan emin olmak nadir değildir. Makro, diğer soket uygulamalarında standart değildir, z / OS'ye özgü bir şey gibi görünmektedir.

Bu sayfaya bir göz atın:
az / VM C Sockets Programını Derleme ve Bağlama


2
z / OS, Windows Linux ile yaptığı kadar z / VM ile ortaktır, bu yüzden bu bağlantıyı neden yayınladığınıza biraz şaşkınım.
paxdiablo

_OE_SOCKETS makrosunun her ikisinde de göründüğüne ve aynı amaca sahip olduğuna dikkat edin. Bu şaşırtıcı değil, çünkü IBM her iki üründe de soket desteği için aynı kod tabanını kullandı. Z / VM belgelerinin z / OS için geçerli olduğunu söylemek istemedim, bulduğum en benzer durum.
Fabio Ceconello

1
Bence bu sadece bir tesadüf. z / VM, soket aramaları yapmak için kullanılan ilgili başlık dosyalarını sağlayan z / OS Dil Ortamı ürününü kullanmaz.
Anthony Giorgio

25

O zaman dene

#define _OE_SOCKETS

sys / socket.h eklemeden önce


19

Yuva sistem çağrıları için bir C ++ sarıcı olan cpp-sockets'e bakmak isteyebilirsiniz . Birçok işletim sistemi (Win32, POSIX, Linux, * BSD) ile çalışır. Ben z / OS ile çalışacağını sanmıyorum ama kullandığı dosyalara bir göz atabilir ve diğer işletim sistemlerinde iyi çalışan test edilmiş kodun birçok örneğine sahip olacaksınız.


18

@Jax: extern "C"Önemli olan çok önemli. Bir üstbilgi dosyasında yoksa, (bir C ++ - yalnızca üstbilgi dosyası değilse), içine #includeonu eklemeniz gerekir:

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

Temel olarak, bir C ++ programının C tabanlı tesislere bağlanmak istediği her zaman, bu extern "C"çok önemlidir. Pratik anlamda, dış referanslarda kullanılan isimlerin normal C ++ isimleri gibi karıştırılmayacağı anlamına gelir. Referans.


14

YASAL UYARI: Ben bir C ++ programcısı değilim, ancak C gerçekten iyi biliyorum. Bu çağrıları sahip olduğum bazı C kodlarından uyarladım.

Ayrıca markdown altyazılarım olarak bu garip _ koydu.

Sadece C soketlerinin etrafına böyle bir şeyle bir soyutlama sınıfı yazabilmelisiniz:

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

Ardından, paketleri soketten açmak, kapatmak ve göndermek için yöntemlere sahip olun.

Örneğin, açık çağrı şöyle 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;
}

Bunun orijinal soru ile ilgisi yok.
Anthony Giorgio

13

Aşağıdaki c89 bayrağını kullanın:

 -D_OE_SOCKETS

Misal:

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

Daha fazla bilgi için z / OS XLC / C ++ Kullanım Kılavuzu'ndaki c89 Seçeneklerine bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.