Sock send () komutunda "Kaynak geçici olarak kullanılamıyor" durumuna ne neden olabilir?


85

Resource temporarily unavailableSoket send()komutunda hataya ne sebep olabilir ? Soket olarak ayarlanmıştır AF_UNIX, SOCK_STREAM. Çoğu zaman çalışır, ancak bazen bu hatayı alır. Soketin alıcı ucu düzgün çalışıyor gibi görünüyor.

Bunun çok ayrıntılı olmadığını biliyorum, ancak sadece genel fikirler arıyorum. Teşekkürler!



4
Soketinizi O_NONBLOCK'a mı ayarlıyorsunuz?
Deepankar Bajpeyi

Bu yazı ile ilgili olduğunu sanmıyorum. Soketlerim SOCK_STREAM ve istediğim şeyin engellendiğine inanıyorum.
giroy

3
Bir akışın engellenmesi veya engellenmemesi, SOCK_STREAM veya SOCK_DGRAM olmasından bağımsızdır. Buradaki cevap alakalı.
Barmar

Yanıtlar:


96

"Resource temporarily unavailable"ile ilgili hata mesajıdır EAGAIN; bu, işlemin engellendiği ancak engellemesiz işlemin istendiği anlamına gelir. Bunun send()nedeni şunlardan herhangi biri olabilir:

  • dosya tanımlayıcısını ile engelsiz olarak açıkça işaretlemek fcntl(); veya
  • geçen MSG_DONTWAITbayrak için send(); veya
  • SO_SNDTIMEOsoket seçeneği ile bir gönderme zaman aşımı ayarlama .

Sorunumun nedeni gönderme zaman aşımını ayarlamaktı. Yardımın için teşekkürler!
giroy

@caf, Benim durumumda, iki taraftaki farklı MTU boyutu yapılandırması, yüksek paket alışverişi oranı varken sctp ilişkilendirmesi Txqueue'nun aşılmasına neden oluyordu. MTU’yu her iki sistemde de aynı yapmak sorunu çözdü. Ama lütfen sorunun arkasındaki nedenin ne olduğunu açıklayabilir mi?
Codename_DJ

46

Bunun nedeni, bir non-blockingsoket kullanmanız ve çıktı tamponunun dolu olmasıdır.

Gönderen send()adam sayfası

EAGAIN , "Kaynak geçici olarak kullanılamıyor" durumuna bağlı hata kodudur

select()Bu davranışları daha iyi kontrol etmek için kullanmayı düşünün


@giroy: ama aslında doğru ... aslında bir engelleme soket ileSO_SNDTIMEO
EML

Harika ama DB'de eşzamanlı okumayı yönetmek için diğer bağlantıları nasıl kullanabiliriz?
MUY Belgium

10

Bir örnek vereyim:

  1. istemci sunucuya bağlanır ve her 1 saniyede bir sunucuya 1MB veri gönderir.

  2. sunucu tarafı bir bağlantıyı kabul eder ve sonra tcp send bufferistemciden mesaj gelmeden 20 saniye uyur, böylece istemci tarafı dolu olur.

İstemci tarafında kod:

Sunucu tarafındaki kod:

Sunucu tarafını başlatın, ardından istemci tarafını başlatın.

sunucu tarafı çıktı verebilir:

görüntü açıklamasını buraya girin

istemci tarafı çıktı verebilir:

görüntü açıklamasını buraya girin

Sunucu tarafı verileri istemciden almadığından, istemci tarafı tcp bufferdolduğunda, ancak yine de veri gönderdiğinizde Resource temporarily unavailablehata alabilirsiniz .

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.