/ dev / tcp Linux'ta mevcut değil


9

UNIX'ten Linux'a C / pro * c kodunu taşıyorum. Kod:

#define __NFDBIT       (8 * sizeof(unsigned long))
#define __FD_SETSIZ    1024
#define __FDSET_LONG   (__FD_SETSIZ/__NFDBIT)
typedef struct {
    unsigned long fds_bits [__FDSET_LONG];
} __ernel_fd_set;

typedef __ernel_fd_set           fd_set_1;
int main()
{
    fd_set_1 listen_set;
    int listen_sd;
    int socket_id;
    FD_ZERO(&listen_set);
    socket_id = t_open("/dev/tcp", O_RDWR|O_NONBLOCK, (struct t_info *) 0);
    if ( socket_id <0 )
    {
        exit(FAILURE);
    }
    return 0;
}

UNIX'te socket_id değeri > 0Linux'tadır -1. Nedeni UNIX'te, bir /dev/tcp. Bu Linux'ta mevcut değil. Ayrıca UNIX'te bu tcpdosya normal dosyadan farklı olan karakter özel dosyasıdır.

Linux'ta UNIX'te olduğu gibi aynı karakterde özel dosya oluşturmanın herhangi bir yolu var mı veya bunu nasıl ilerletebilirsiniz?


5
Berkeley soketlerini / POSIX soketlerini kullanmamanızın bir nedeni var mı ?
jofel

evet Jofel. Bu durumda, mümkün olmayan mevcut kodun büyük miktarını değiştirmeniz gerekiyor. Linux'ta / dev / tcp'nin değiştirilmesini veya Unix'te olduğu gibi çalışması için Linux'ta nasıl oluşturulması gerektiğini arıyorum. Aşağıda Unix'te / dev / tcp hakkında bilgiler bulunmaktadır.
missingsemicolon

1
Yazılımınızı nasıl derliyorsunuz? Linux üzerinde AFAIK, XTı / TYD sadece bazı ekstra gibi kütüphaneler tarafından desteklenmektedir Hızlı Linux Çayı'nın OpenSS7 dan gibi veya emülatörlerine IBC'lerde . Linux üzerinde / dev / tcp oluşturmanın bir yolu yoktur. / Dev / tcp dosyasını bash'ta bulabilirsiniz, ancak bu durumda bash'a bir tcp soketi açmasını söyleyen bir emanettir. Cihaz gerçekten mevcut değil.
jofel

cc tet.o -o testi-L $ ORACLE_HOME / lib64 -lxnet yürütülen ikili dosya testi mknod tcp c <x> <y> komutunu kullanarak / dev altında tcp karakter dosyası oluşturmanın bir yolu vardır. Unix'te tcp için cihaz girişleri 42,2'dir. dosya komutu (dosya / dev / tcp) "özel karakter (42/2)" gösterir, burada x = 42 ve y = 2'dir. Ama mknod tcp c 42 2.again soket_id olarak Linux'ta oluşturduğum aynı girişlerle -1. Burada sorun Linux kullanılacak cihaz girişleri.
missingsemicolon

1
@ smilebhuff Düğümü oluşturmak yeterli değildir, çekirdekteki birisinin bundan sorumlu olması gerekir - ki bu Linux altında geçerli değildir.
glglgl

Yanıtlar:


18

t_open()ve ilişkili /dev/tcpve bir parçası olan TYD / XTT arayüzü BSD soketleri için TCP / IP API'leri için savaş kayıp.

Linux'ta bir /dev/tcpçeşit var. Gerçek bir dosya veya çekirdek cihazı değil. Bu , Bash tarafından özel olarak sağlanan bir şeydir ve yalnızca yönlendirmeler için mevcuttur. Bu, bir çekirdek içi /dev/tcptesis yaratacak olsa bile , kabuk tarafından zamanın% 99'u [*] interaktif kullanımda maskeleneceği anlamına gelir .

En iyi çözüm gerçekten BSD soketlerine geçmektir. Afedersiniz.

Strxnet XTI öykünme katmanının çalışmasını sağlayabilirsiniz , ancak XTI'dan çıkmaya zaman ayırmanız daha iyi olur. Sadece Linux'ta değil, OS X dahil BSD'lerde de desteklenmeyen ölü bir API.

(Bu arada, strxnet kütüphanesi BSD'lere bile dayanmayacak, çünkü Linux çekirdeğinin bir bileşeni olan LiS'ye bağlı . configureGörünüşe göre aynı zamanda bir BSD veya OS X sistemine bile sahip olmayacak . GNU sed.)

[*] Bu vahşi tahminin, Bash'in kullandığım tüm Linux dağıtımlarında root olmayan kullanıcılar için varsayılan kabuk olduğu gerçeğine dayandığını düşünüyorum. Bu nedenle, Bash'den başka bir şey elde etmek için kural olarak Linux'ta kendi yolunuzdan çıkmanız gerekir.


Warren girdileriniz için teşekkürler. Maalesef bu soket programlama ve API konseptlerinde çok yeniyim. Lütfen sorularımı çıplak bırak. "Strxnet XTI öykünme latyer" ile ne demek istiyorsun kısa süre önce strxnet (strxnet-0.9.2.10.tar) paketlerinden birini kurduk.
missingsemicolon

Hiç kullanmadım, ancak tarball'ın hızlı bir incelemesinden sonra, kurulduktan sonra bir XTI emülasyon tabakası sağlar. Derleyicinizi -Ive -Lbayraklarıyla işaret edebilmeniz ve çalışmasını beklemeniz gerekir. Ama eğer yapmazsa, ona çok fazla zaman atmazdım.
Warren Young

Sırasıyla başlıkları / kütüphaneleri içerecek olan -I ve -L'yi biliyorum. Ama burada -I / -L ile tam olarak ne yapmam gerekiyor? sorum yanlışsa tekrar özür dilerim.
missingsemicolon

1
Bu, paketin dosyaları nereye yüklediğine bağlıdır. Kütüphane dosyasını bulun libstrxnet.so.*:: o dizin geçtiğiniz şeydir -L. Bul xti.h: dizini bu klasöre aktarın -I. Ayrıca -lstrxneten azından ihtiyacınız olacak . Alt satır: strxnet belgelerine bakın.
Warren Young

Warren, derleme sırasında bunu yaptım. lütfen önceki komutta verdiğim adımlara bakın. Bu kütüphane t_open () işlevine sahiptir. Ancak sorun bu fonksiyonda değildir. Sorun / dev / tcp ile ilgili t_open açmaya çalışıyor.
missingsemicolon
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.