42 Project
work in progress
- socket: Bir soket oluşturur ve iletişim için kullanılacak bir dosya tanıtıcısı döndürür.
- close: Bir soketi kapatır ve kullanılan kaynakları serbest bırakır.
- setsockopt: Bir soketin seçeneklerini ayarlar.
- getsockname: Bir soketin yerel adresini döndürür.
- getprotobyname: Protokol ismine karşılık gelen protokol numarasını döndürür.
- gethostbyname: Bir ana bilgisayar adına karşılık gelen IP adresini döndürür.
- getaddrinfo: Bir hedef ad ve servis için bağlantı noktası bilgilerini döndürür.
- freeaddrinfo: getaddrinfo işlevi tarafından oluşturulan adres bilgilerini serbest bırakır.
- bind: Bir soketi belirtilen adres ve bağlantı noktasına bağlar.
- connect: Bir soketi belirtilen hedefe bağlar.
- listen: Bir soketi gelen bağlantı talepleri için dinlemeye başlar.
- accept: Bağlantı taleplerini kabul eder ve yeni bir soket oluşturur.
- htons: 16 bitlik bir değeri ağ bayt sırasına dönüştürür.
- htonl: 32 bitlik bir değeri ağ bayt sırasına dönüştürür.
- ntohs: 16 bitlik bir değeri ana makine bayt sırasına dönüştürür.
- ntohl: 32 bitlik bir değeri ana makine bayt sırasına dönüştürür.
- inet_addr: IP adresini, IPv4 adresinin ikili formuna dönüştürür.
- inet_ntoa: IPv4 adresinin ikili formunu IP adresine dönüştürür.
- send: Bir soketten veri gönderir.
- recv: Bir soketten veri alır.
- signal: Bir sinyal işleyici atanmasını sağlar.
- lseek: Dosya konum göstergesini ayarlar.
- fstat: Bir dosyanın durum bilgilerini alır.
- fcntl: Dosya tanıtıcısının özelliklerini değiştirir.
- poll: Bir dizi dosya tanıtıcısını dinler ve olayları bekler.
C++'da socket
fonksiyonu, soket oluşturmak için kullanılır ve aşağıdaki şekliyle tanımlanır:
int socket(int domain, int type, int protocol);
socket
fonksiyonunun üç argümanı vardır:
-
domain: Soketin kullanacağı adresleme alanını belirtir. Örnek olarak:
AF_INET
: IPv4 adresleme alanı.AF_INET6
: IPv6 adresleme alanı.AF_UNIX
veyaAF_LOCAL
: Unix etki alanı soketleri.
-
type: Soketin türünü belirtir. Örnek olarak:
SOCK_STREAM
: İkiden çok nokta arasında güvenilir, bağlantı temelli bir soket (TCP).SOCK_DGRAM
: İkiden çok nokta arasında güvenilmeyen, bağlantısız bir soket (UDP).
-
protocol: Soketin kullanacağı protokolü belirtir. Genellikle 0 olarak belirtilir, bu durumda
socket
fonksiyonu,type
parametresine bağlı olarak uygun protokolü seçer. Ancak, belirli bir protokol kullanmak istiyorsanız, uygun protokol numarasını belirtmelisiniz. Örneğin:IPPROTO_TCP
: TCP protokolü.IPPROTO_UDP
: UDP protokolü.
socket
fonksiyonu, başarılı olursa oluşturulan soketin dosya tanıtıcısını (file descriptor) döndürür. Başarısızlık durumunda -1 döndürür.
Örnek kullanımlar:
int tcpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP soketi oluşturur
int udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // UDP soketi oluşturur
Yukarıdaki örneklerde, AF_INET
adresleme alanında çalışan TCP ve UDP soketleri oluşturulmaktadır.
listen
fonksiyonu, bir soketi bağlantı taleplerini kabul etmeye hazır hale getirmek için kullanılır. Aşağıda listen
fonksiyonunun imzası ve argümanları yer almaktadır:
int listen(int sockfd, int backlog);
listen
fonksiyonunun iki argümanı vardır:
-
sockfd: Dinlemeye alınacak soketin dosya tanıtıcısı (file descriptor) veya soketin kendisi. Bu,
socket
fonksiyonu tarafından döndürülen soketin dosya tanıtıcısıdır. -
backlog: Bekleyen bağlantı sırasındaki bağlantı kuyruğunun maksimum uzunluğunu belirten bir tamsayı değeri. Bu, aynı anda kabul edilebilecek maksimum bağlantı sayısını belirtir. Talep edilen bağlantılar bu kuyrukta bekler. Bağlantıların taleplerini kabul etmek için
accept
fonksiyonu kullanılır.
listen
fonksiyonu, başarı durumunda 0 değerini döndürür. Başarısızlık durumunda -1 döndürür ve errno
değişkeni ayarlanır.
Örnek bir kullanım:
if (listen(sock, 5) == -1) {
std::cerr << "Soket dinlemeye başlanamadı." << std::endl;
return 1;
}
Yukarıdaki örnekte, listen
fonksiyonu sock
soketini dinlemeye başlar ve maksimum 5 bağlantı talebini kuyrukta bekletebilir. Bu, aynı anda en fazla 5 bağlantı talebinin kabul edilebileceği anlamına gelir.
Soketi dinlemeye almak için aşağıdaki adımları izleyebilirsiniz:
-
Soket oluşturun:
socket
fonksiyonunu kullanarak bir soket oluşturun. İlgili adresleme alanı (AF_INET
veyaAF_INET6
) ve soket türü (SOCK_STREAM
veyaSOCK_DGRAM
) seçimini yapın. -
Adres ve bağlantı noktası atanın: Oluşturulan sokete bir adres ve bağlantı noktası atayın. Bu,
bind
fonksiyonunu kullanarak yapılır. Adres, genellikle "localhost" veya kullanmak istediğiniz bir IP adresi olabilir ve bağlantı noktası belirli bir port numarasıdır. -
Dinlemeye başlayın: Soketi dinlemeye başlamak için
listen
fonksiyonunu kullanın. Bu fonksiyon, gelen bağlantı taleplerini kabul etmeye ve uygun bağlantıları oluşturmak için beklemeye başlar.
Örnek bir C++ programında bu adımlar aşağıdaki gibi olabilir:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
// Soket oluşturma
int soket = socket(AF_INET, SOCK_STREAM, 0);
if (soket == -1) {
std::cerr << "Soket oluşturulamadı." << std::endl;
return 1;
}
// Soket adresi ayarlama
sockaddr_in serverAddress{};
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); // Tüm yerel IP adreslerini kabul et
serverAddress.sin_port = htons(12345); // Belirli bir bağlantı noktası
// Soketi localhost ve belirli bir bağlantı noktasına bağlama
if (bind(soket, reinterpret_cast<sockaddr*>(&serverAddress), sizeof(serverAddress)) == -1) {
std::cerr << "Soket bağlanamadı." << std::endl;
return 1;
}
// Soketi dinlemeye başlama
if (listen(soket, 1) == -1) {
std::cerr << "Soket dinlemeye başlanamadı." << std::endl;
return 1;
}
std::cout << "Soket oluşturuldu ve dinleme başladı." << std::endl;
// Soketi kapatma
close(soket);
return 0;
}
Yukarıdaki örnekte, soket oluşturulur, bir adres ve bağlantı noktası atanır ve soket dinlemeye başlar. Program, "Soket oluşturuldu ve dinleme başladı." mesajını gösterecektir. Bu noktadan itibaren soket, gelen bağlantı taleplerini kabul edebilir ve uygun işlemlerle devam edebilirsiniz.