2011-04-17 19 views
6

kapatın:incelikle Ben C, IRC istemcisi yazıyorum ++ ve halen ben çıkışta, tanıyorum, bir sorun yaşıyorum Bir TCP soketi

Send("QUIT :Quit\r\n"); // just an inline, variadic send() wrapper 
shutdown(m_hSocket, SD_BOTH); 
closesocket(m_hSocket); 

WSAShutdown(); 

Ancak konudur QUIT mesajın olduğunu gönderilmiyor. İstemciden gelen paketleri kokladım ve bu mesaj asla yollanmadı. Bunun soketle temizlenmemesiyle ilgili bir sorun olduğuna inanıyorum, ancak bunun nasıl yapılacağını bilmiyorum ve Google Nagle'in algoritmasını devre dışı bırakmayı önerdi ancak bunun iyi bir uygulama olduğundan şüphe duyuyorum.

Şimdiden teşekkürler.

+0

Çalışmaya başladığınızda, bazı IRC ağlarının> 5 dakika boyunca oturum açana kadar (gerçek uzunluk ağa bağlı olarak değişir) özel bir çıkış mesajı göstermeyeceğini unutmayın. Bu senin şu anki sorunun bir cevabı değil, ama daha sonra kafa karıştırıcı olabilecek bir tuhaflık var :) –

+0

İlginç bir nokta, ama şimdi bir çift için çıktım, bıraktım ve hala var: Okuma hatası: Bağlantı peer – Saul

+0

yup tarafından sıfırlama, sadece soket sorunu düzeltildi zaman için bahsetmiştim diye düşündüm :) –

cevap

5

Her şeyden önce send dönüş değerini kontrol etmelisiniz: gerçekte ağ yığını tarafından kabul edilmeyi denediğiniz veriler var mı? (Genel olarak bu, sadece bu durumda değil, her bir send çağrısından sonra yapılmalıdır). Verilerin kabul edildiği kabul edilirse, AFAIK, shutdown numaralı telefonun aranması sonucu gerçekten iletilmelidir. Bir fark yaratıp yaratmadığını görmek için SO_LINGER kullanmayı deneyebilirsiniz, bkz. Graceful Shutdown, Linger Options, and Socket Closure on MSDN.

+0

Düzeltmeyi bu MSDN makalesinin yorumlarını kullanarak bile, çıkışta yuvaları kapatırken hala hata alıyorum. WSACleanup() buna neden görünüyor. Her neyse, teşekkürler Jon! : D – Saul

+7

shutdown() işlevini çağırdıktan sonra, uzak eşin bağlantı kesme isteğini onayladıktan sonra, bir döngü içinde recv() 'yi (isteğe bağlı olarak' select() 'ile arayarak" closesocket() "işlevini çağırmamalısınız. 0 (veya bir hata) döndürene kadar 'recv()') ne zaman çağrılacağını bilmek. –