Veri Aktarımı
Önceki Soketlerin Bağlantılarla Kullanılması Sonraki
Veri Aktarımı
Soket bir kez karşıya bağlandığında, veri aktarımı için sıradan okuma ve yazma işlemleri (Girdi ve Çıktı İlkelleri) yapabilirsiniz. Bir soket iki yönlü haberleşme kanalıdır, böylece okuma ve yazma işlemleri her iki uçta da gerçekleştirilebilir.
Soket işlemlerine özgü bazı G/Ç kipleri de vardır. Bu kipleri belirtmek için, recv ve send işlevlerini daha genel olan read ve write işlevleri yerine kullanmanız gerekir. recv ve sendişlevleri, özel G/Ç kiplerini kontrol etmek için çeşitli bayrakları belirtebileceğiniz, ek bir argüman alırlar. Örneğin, MSG_OOB bayrağını belirterek sırasız veri okuyup yazabilirsiniz, MSG_PEEK bayrağını girdiyi gözetlemek için, MSG_DONTROUTE bayrağını yönlendirme bilgisinin çıktıda içerilmesini kontrol için kullanabilirsiniz.
Veri Gönderimi
send işlevi sys/socket.h başlık dosyası içinde tanımlıdır. Eğer bayraklar argümanınız sıfır ise, send yerine write kullanabilirsiniz; bkz. Girdi ve Çıktı İlkelleri. Eğer soket bağlıyken bağlantısı koptuysa, send veya write'ın her hangi bir kullanımı için SIGPIPE sinyalini alırsınız.
int send
(int    soket,
 void  *tampon,
 size_t boyut,
 int    bayraklar)
işlev
send işlevi write gibidir, ancak fazladan bayraklar argümanına sahiptir. Olası bayrak değerleri Soket Verisi Seçenekleri bölümünde anlatılmıştır.
Bu işlev aktarılan bayt miktarı ile veya hata durumunda -1 ile döner. Soket baskılanamayan kipteyse send (write gibi) verinin henüz bir kısmını gönderdikten sonra dönebilir. Baskılanamayan kip hakkında daha fazla bilgi için Dosya Durum Seçenekleri bölümüne bakınız.
Unutmayalım ki, başarılı bir dönüş değeri her ne kadar verinin hatasız bir şekilde gönderildiğini belirtse de, hatasız bir şekilde alındığını belirtmez.
Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EBADF
soket soketi geçerli bir dosya tanımlayıcı değil.
EINTR
Veri gönderilmeden önce işlem bir sinyal tarafından kesildi. Bkz. Sinyallerle Kesilen İlkeller.
ENOTSOCK
soket dosya tanımlayıcısı bir soket değil.
EMSGSIZE
Soket türü verinin bütün olarak gönderilmesini gerektiriyor, fakat veri bunun olması için çok büyük.
EWOULDBLOCK
Soket baskılanamayan kipte ve yazma işlemi soketi baskılar. (Normalde send işlem bitinceye kadar soketi baskılar.)
ENOBUFS
Yeterli dahili tampon alanı yok.
ENOTCONN
Bu sokete hiç bağlanmadınız.
EPIPE
Bu soket bağlıydı ancak bağlantı koptu. Bu durumda, send öncelikle bir SIGPIPE sinyali üretir; sinyal ihmal edilir veya baskılanırsa ya da bu sinyalin yakalayıcısı dönerse send işlevi EPIPE hatası ile sonlanır.
Bu işlev çok evreli yazılımlar için iptal noktası olarak tanımlanmıştır, bu nedenle ayrılan özkaynakların (bellek, dosya tanımlayıcısı, semafor veya her hangi başka bir kaynak) evre iptal edilse dahi serbest bırakılmasının sağlanması şarttır.
Veri Alımı
recv işlevi sys/socket.h başlık dosyası içinde tanımlıdır. Eğer bayraklar argümanlarınız sıfırsa, recv yerine read kullanabilirsiniz; bkz. Girdi ve Çıktı İlkelleri.
int recv
(int    soket,
 void  *tampon,
 size_t boyut,
 int    bayraklar)
işlev
recv işlevi read gibidir, ancak fazladan bayraklar argümanına sahiptir. Olası bayrak değerleri Soket Verisi Seçenekleri bölümünde anlatılmıştır.
Eğer soket için baskılanamayan kip seçildiyse ve okunacak veri yoksa, recv beklemeden hemen sonlanır. Baskılanamayan kip hakkında daha fazla bilgi için Dosya Durum Seçenekleri bölümüne bakınız.
Bu işlev aktarılan bayt miktarı ile veya hata durumunda -1 ile döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EBADF
soket soketi geçerli bir dosya tanımlayıcı değil.
ENOTSOCK
soket dosya tanımlayıcısı bir soket değil.
EWOULDBLOCK
Soket baskılanamayan kipte ve okuma işlemi soketi baskılar. (Normalde recv okunacak girdi oluncaya kadar soketi baskılar.)
EINTR
Veri okunmadan önce işlem bir sinyal tarafından kesildi. Bkz. Sinyallerle Kesilen İlkeller.
ENOTCONN
Bu sokete hiç bağlanmadınız.
Bu işlev çok evreli yazılımlar için iptal noktası olarak tanımlanmıştır, bu nedenle ayrılan özkaynakların (bellek, dosya tanımlayıcısı, semafor veya her hangi başka bir kaynak) evre iptal edilse dahi serbest bırakılmasının sağlanması şarttır.
Soket Verisi Seçenekleri
send ve recv işlevlerindeki bayraklar argümanı bir bit maskesidir. Aşağıdaki makroların değerlerini bit bit VEYAlayarak bu argüman için değer elde edebilirsiniz. Hepsi sys/socket.h başlık dosyası içinde tanımlıdır.
int MSG_OOB
makro
Sırasız veri gönderilir ve alınır; bkz. Bantdışı Veri Aktarımı.
int MSG_PEEK
makro
Veriye bakılır ancak girdi kuyruğundan çıkarılmaz. Bu sadece recv gibi girdi işlevleri için anlamlıdır (send ile anlamlı değildir).
int MSG_DONTROUTE
makro
Yönlendirme bilgisi iletinin içinde bulunmaz. Bu sadece çıktı işlevlerinde anlamlıdır ve genellikle sadece tanı veya yönlendirme amaçlı yazılımlarda kullanılır. Bunu burada anlatmaya çalışmayacağız.
Önceki Üst Ana Başlık Sonraki
Bana Kim Bağlı? Başlangıç Bayt Akımlı Soket Örneği
Bir Linux Kitaplığı Sayfası