close() ve shutdown() -- Düş Yakamdan!
Önceki Sistem Çağrıları veya Felaketleri Sonraki
close() ve shutdown() -- Düş Yakamdan!
Vay be! Deminden beri send() ile veri gönderip recv() ile de veri okuyorsunuz ve artık yoruldunuz. Soket tanımlayıcınız ile ilişkilendirilmiş olan bağlantıyı kesmenin zamanıdır. Kolayı var. Alışık olduğunuz Unix dosya tanımlayıcı kapatma işlevi olan close() işlevini kullanın:
close(sockfd); 
Böylece artık bu sokete ne yazılabilir ne de buradan veri okunabilir. Diğer uçta bunları yapmaya çalışan kişi artık bir hata mesajı ile karşılaşacaktır.
Eğer soket kapatma işlemi üzerinde biraz daha deentim sahibi olmak isterseniz o zaman shutdown() işlevini tercih edebilirsiniz. Bu işlevi kullanarak iletişim kanalını tek yönlü ya da çift yönlü olarak kapatabilirsiniz ( close() işlevi iki taraflı olarak keser). İşlev şöyledir:
int shutdown(int sockfd, int how); 
sockfd kapatmak istediğiniz soket dosya tanımlayıcısıdır ve how değişkeni de şu değerlerden birini alabilir:
  • 0 -- Bundan sonraki okumalara izin verme
  • 1 -- Bundan sonraki göndermelere (yazmalara) izin verme
  • 2 -- Bundan sonraki göndermelere ve okumalara izin verme (close() işlevinin yaptığı gibi)
shutdown() başarılı olarak görevini tamamlarsa 0 döndürür ama eğer bir hata ile karşılaşırsa -1 döndürür (ve errno değişkenine hata kodunu yazar).
Eğer shutdown() işlevini bağlantısız veri paketi soketleri üzerinde kullanırsanız bu soketler artık send() ve recv() işlevleri tarafından kullanılamaz hale gelirler (bunları, connect() ile bağlanmak istediğinizde kullanabileceğinizi unutmayın).
Bir başka önemli nokta da: shutdown() aslında dosya tanımlayıcısını kapatmaz sadece kullanılabilirliğini değiştirir. Soket tanımlayıcısını gerçekten iptal etmek istiyorsanız close() kullanmalısınız.
Yapacak birşey yok.
Önceki Üst Ana Başlık Sonraki
sendto() ve recvfrom() -- Benimle UDP'ce Konuş  Başlangıç getpeername() -- Kimsiniz?
Bir Linux Kitaplığı Sayfası