2010-02-10 18 views
5

iki iş istasyonundan oluşan bir uygulama Unix alan soketleri ile birbirine bağlanmış, (en A ve B diyelim). Çoğu zaman iyi çalışıyor, ancak bazı kullanıcılar şu davranışı rapor:Her iki uç da kapatmadan() veya kilitlenmeden spontan bir EPIPE hatasına neden olabilir?

  1. A Bu işleri B'ye bir istek gönderir. Bir geç
  2. B karşılık gelen yazma() çağrısı EPIPE hata verir A'ya bir yanıt gönderir B. Cevabı okumaya başlar, ve sonuç olarak, B yakın olarak() yuva. Ancak, A soketini kapattı(), ne de çöktü. son dosya-gösteren
  3. A'nın okuma() çağrı döner 0,. A, B'nin bağlantıyı erken kapattığını düşünüyor.

kullanıcılar da bu davranışın varyasyonlarını bildirmişlerdir, örneğin:

  1. A Bu kısmen çalışır B. bir istek gönderir, ancak tüm istek A'nın yazma gönderilmeden önce() çağrısı EPIPE döndürür ve Sonuç olarak bir() soketi kapatın. Ancak B soketi kapatmadı(), ne de çarptı.
  2. B kısmi isteği okur ve sonra aniden bir EOF alır.

sorun ben hiç yerel olarak bu davranışı yeniden olamaz. OS X ve Linux'u denedim. Kullanıcılar çoğunlukla OS X ve Linux gibi çeşitli sistemlerde. Zaten denenmiş ve kabul ettik

şeyler:

  • Çift close() (close() aynı dosya tanımlayıcı üzerinde iki kez denir) böcek: muhtemelen bu EBADF hatalara neden ederim ama olarak Onları görmedim.
  • Maksimum dosya tanıtıcı sınırının artırılması. Bir kullanıcı bunun onun için çalıştığını bildirdi, gerisi bunun olmadığını bildirdi.

başka neler muhtemelen böyle davranışa neden olabilir? Ne A ne B ne de B kapağını erken kapattığımı kesin olarak biliyorum ve her ikisinin de A ve B hatalarını bildirebildiğinden emin olmadıklarını biliyorum. Çekirdek aniden fişi soketten bir sebepten çekmeye karar verdi.

cevap

3

Belki strace deneyebilirsiniz tabii the packet sniffer taşımaktadır: http://modperlbook.org/html/6-9-1-Detecting-Aborted-Connections.html

Ben senin sorunun burada açıklanan birine alakalı olduğunu varsayarak: http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable

Ne yazık ki ben bir similar problem yaşıyorum ama verilen tavsiyeleri ile sabit almak için başaramadı. Ancak, belki de bu SO_LINGER şey sizin için çalışıyor.

+0

Sunucunun dosya tanıtıcısının EPOLLET bayrağının epoll kuyruğuna eklenmesi yanlış görünüyordu. – user206268

+2

Tam olarak aradığım cevap tam olarak değil, bağlantı kurduğunuz TCP sayfası çok bilgilendirici! Şu anda Archive.org tarafından şu anda var: http://ia700609.us.archive.org/22/items/TheUltimateSo_lingerPageOrWhyIsMyTcpNotReliable/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reli .html – Hongli

2
  • shutdown() soket uç noktalarından biri çağrılmış olabilir.

  • iki tarafında da devralınacak için niyetli olmadığınızı yapsam FD_CLOEXEC (kapat-on-exec) bayrak soket dosya tanımlayıcı üzerinde ayarlanmış olduğundan emin olun, çatal ve bir çocuk sürecini yürütebilir Eğer

    çocuk tarafından. Aksi takdirde, numaralı çocuk işlemi soket bağlantınızı manipüle ederek (yanlışlıkla veya başka şekilde) olabilir.

+0

Teşekkürler, ancak her iki durum programımda geçerli değildir. – Hongli

0

Ayrıca ortada sinsi bir güvenlik duvarı olmadığını da kontrol ediyorum. Güzergah üzerindeki bir ara yönlendirme düğümü, bir RST gönderir.(. Veya onun GUI cousin) açıklandığı gibi bu izini iyi yolu

+0

... UNIX alan soketinde mi? Bu sadece yerel bir protokol. – ephemient

+0

Oh ... ateş et, bunu çok özledim. Teşekkürler. –

İlgili konular