Sanırım artık daha fazla erteleyemem -- socket()
sistem çağrısından bahsetmek zorundayım. İşte o işlev:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
Peki ya argümanlar? Önce, domain argümanına
AF_INET değeri verilmeli, tıpkı
struct sockaddr_in yapısında olduğu gibi. Sonra
type argümanı çekirdeğe ne tür bir soket
söz konusu olduğunu söyler: SOCK_STREAM veya
SOCK_DGRAM. Son olarak da
protocol argümanına "0"
değerini verelim ki socket(),
type değişkenine karşılık gelen uygun protokolü
seçebilsin. (Dikkat: Bahsettiğimden daha çok
domain ve type vardır.
Bkz. socket() man sayfası. Ayrıca
protocol değerini öğrenmenin "daha iyi" bir
yöntemi vardır. Bkz. getprotobyname() man
sayfası.)
socket() işlevi size bir soket tanımlayıcı
döndürür ve artık siz bunu daha sonraki işlevlerinize parametre olarak
geçebilirsiniz. Eğer bir hata oluşursa işlev -1
değerini döndürür. Bu durumda errno isimli
global değişken hata kodunu tutar (bkz. perror()
man sayfası.)
Bazı belgelerde mistik bir PF_INET ifadesi
görebilirsiniz, korkmayın. Normalde bu canavar günlük hayatta pek
karşınıza çıkmaz fakat gene de kendisinden biraz bahsedeyim. Uzun
zaman önce adres ailesinin (AF_INET'deki "AF"
"Address Family" manasındadır) pek çok protokolü destekleyebileceği
düşünülmüştü ( PF_INET'deki "PF" "Protocol Family"
manasındadır). Ancak böyle bir şey olmadı. Yani doğru olan,
AF_INET değerini struct sockaddr_in
yapısında kullanmanız ve PF_INET'i ise
socket() çağırırken kullanmanızdır. Ancak pratik
olarak AF_INET'i her yerde kullanabilirsiniz.
Bu işin üstadlarından W. Richard Stevens kitabında böyle yaptığı için
ben de burada böyle yapacağım.
Peki tamam çok güzel de bu soket ne işe yarar? Tek başına bir işe yaramaz
tabii, lütfen okumaya devam edin ve diğer sistem çağrılarını öğrenin ki
taşlar yerine otursun.