2011-10-15 15 views
7

Aşağıdaki şekilde bir TCP soketinin bir tanımlayıcısını aldım:Soketler için tanımlayıcılar File Pointers'a dönüştürülebilir mi?

int desc = accept(socket_descriptor, &client_address, &len)

Şimdi bu tanımlayıcıdan desc Bir dosya tanıtıcısı almak istiyorum. Xzx12 burada kullanılabilir mi?

Dosya tanıtıcısı almak istediğim nedeni, verileri yerel bir dosyaya yazan mevcut bir kodda değişiklik yapıyorum. Şimdi, işlevselliğini, bir TCP istemcisine alternatif olarak yazabilmesi için genişletmek istiyorum. Tüm fonksiyonları yeniden yazmak istemiyorum ve bir şekilde mevcut altyapıyı kullanabileceğimi düşünüyordum. Varolan işlevler dosyaya yazmak için dosya işaretçisini kullanır. Aynı işlevi herhangi bir değişiklik yapmadan bir TCP akışına yazmanın mümkün olup olmadığını merak ediyordum.

cevap

8

Evet, fdopen() ihtiyacınız tam olarak budur. İşte man page bu konuda söylediğini ne:

fdopen() fonksiyonu mevcut dosya tanımlayıcısı, fd ile bir akış ilişkilendirir. akışının modu (değerler "r", "r +" biri "W", "a", "w +", "A +") dosyası tanımlayıcının modu ile uyumlu olması gerekir. Yeni akımının dosya konum göstergesi fd ait ayarlı ve hata ve sonu dosyasındaki göstergeleri temizlenir vardır edilir. "W" veya "w +" modları, dosyanın kesilmesine neden olmaz. Dosya tanıtıcı dup'ed değildir ve fdopen yarattığı akışı () kapatıldığında kapatılacak. Fdopen() uygulamasının paylaşılan bellek nesnesine uygulanmasının sonucu tanımlanmamıştır. tanımlayıcılar soket uygularken

Ama dikkatli kullanın. Yüksek düzey G/Ç işlevleri arabelleğe almayı kullanır ve verileri farklı şekilde gönderebilir (yani, akışta \n akışının bulunduğu her defasında flush, \r ekler) vb.

+1

Çoğu dosya satır ara belleğe alınmaz, yalnızca 'stdout'. Bir dosyanın satır arabelleği olarak ayarlanmasının bir yolu olup olmadığından emin değilim, ama çoğunun blok arabelleğe alınacağına inanıyorum, bu da biraz daha fazla yuva dostu olmalıdır. –

+0

@ChrisLutz: İşlev "setlinebuf". Sanırım bir uçbirime bağlandığında stdout'un sadece satır tamponlu olduğunu düşünüyorum, ama emin değilim. –

+0

@DietrichEpp - Teşekkürler. Ve bence stdout hakkında haklısın. –

İlgili konular