Soket Programlama Nedir?
Soket programlama, bir ağdaki iki düğümü birbirleriyle iletişim kurmaları için birbirine bağlamanın bir yoludur. Bir soket (düğüm), bir IP'deki belirli bir portu dinlerken, diğer soket bir bağlantı oluşturmak için diğerine ulaşır. Sunucu, istemci sunucuya ulaşırken dinleyici soketini oluşturur.
Sunucu ve İstemci Modeli için Durum Diyagramı
C'de soket programlama, ağ iletişimini yönetmenin güçlü bir yoludur.
Sunucu için Aşamalar
Sunucu aşağıdaki adımlar izlenerek oluşturulur:
1. Soket Oluşturma
sockfd: soket tanımlayıcısı, bir tam sayı (bir dosya tanıtıcısı gibi)
etki alanı: tam sayı, iletişim etki alanını belirtir. Aynı ana bilgisayardaki süreçler arasındaki iletişim için POSIX standardında tanımlandığı gibi AF_LOCAL kullanırız. IPV4 ile bağlanan farklı ana bilgisayarlardaki süreçler arasındaki iletişim için, IPV6 ile bağlanan süreçler için AF_INET ve AF_I NET 6 kullanırız.
tür: iletişim türü
SOCK_STREAM: TCP(güvenilir, bağlantı odaklı)
SOCK_DGRAM: UDP(güvenilmez, bağlantısız)
protokol: İnternet Protokolü (IP) için 0 olan protokol değeri. Bu, bir paketin IP başlığındaki protokol alanında görünen sayıyla aynıdır. (daha fazla ayrıntı için man protocols)
2. Setsockopt
Bu, sockfd dosya tanımlayıcısı tarafından başvurulan soket için seçeneklerin düzenlenmesine yardımcı olur. Bu tamamen isteğe bağlıdır, ancak adres ve portun yeniden kullanılmasına yardımcı olur. "Adres zaten kullanımda" gibi hataları önler.
3. Bağlamak
Soket oluşturulduktan sonra, bind fonksiyonu soketi addr(özel veri yapısı)'nda belirtilen adrese ve port numarasına bağlar. Örnek kodda, sunucuyu localhost'a bağlarız, dolayısıyla IP adresini belirtmek için INADDR_ANY kullanırız.
4. Dinle
Sunucu soketini, istemcinin bağlantı kurmak için sunucuya yaklaşmasını beklediği pasif bir moda sokar. Geri bildirim, sockfd için bekleyen bağlantıların kuyruğunun büyüyebileceği maksimum uzunluğu tanımlar. Kuyruk doluyken bir bağlantı isteği gelirse, istemci ECONNREFUSED göstergesi olan bir hata alabilir.
5. Kabul et
Dinleme soketi sockfd için bekleyen bağlantılar kuyruğundaki ilk bağlantı isteğini çıkarır, yeni bir bağlı soket oluşturur ve bu sokete atıfta bulunan yeni bir dosya tanımlayıcısı döndürür. Bu noktada, istemci ve sunucu arasında bağlantı kurulur ve veri aktarmaya hazırdırlar.
Müşteri için Aşamalar
1. Soket bağlantısı: Sunucunun soket oluşturma işlemiyle tamamen aynıdır
2. Bağlan: connect() sistem çağrısı, sockfd dosya tanımlayıcısı tarafından başvurulan soketi addr tarafından belirtilen adrese bağlar. Sunucunun adresi ve portu addr'de belirtilir.
Uygulama
Burada istemci/sunucu modelini göstermek için sunucu ve istemci arasında tek bir merhaba mesajı alışverişinde bulunuyoruz.
Sunucu Oluşturmak İçin C Programı
Server.c
İstemci Oluşturmak İçin C Programı
Customer.c
Çıktı
Derleme
gcc client.c -o client
gcc server.c -o server
Soket programlama, bir ağdaki iki düğümü birbirleriyle iletişim kurmaları için birbirine bağlamanın bir yoludur. Bir soket (düğüm), bir IP'deki belirli bir portu dinlerken, diğer soket bir bağlantı oluşturmak için diğerine ulaşır. Sunucu, istemci sunucuya ulaşırken dinleyici soketini oluşturur.
Sunucu ve İstemci Modeli için Durum Diyagramı

C'de soket programlama, ağ iletişimini yönetmenin güçlü bir yoludur.
Sunucu için Aşamalar
Sunucu aşağıdaki adımlar izlenerek oluşturulur:
1. Soket Oluşturma
int sockfd = socket(domain, type, protocol)
sockfd: soket tanımlayıcısı, bir tam sayı (bir dosya tanıtıcısı gibi)
etki alanı: tam sayı, iletişim etki alanını belirtir. Aynı ana bilgisayardaki süreçler arasındaki iletişim için POSIX standardında tanımlandığı gibi AF_LOCAL kullanırız. IPV4 ile bağlanan farklı ana bilgisayarlardaki süreçler arasındaki iletişim için, IPV6 ile bağlanan süreçler için AF_INET ve AF_I NET 6 kullanırız.
tür: iletişim türü
SOCK_STREAM: TCP(güvenilir, bağlantı odaklı)
SOCK_DGRAM: UDP(güvenilmez, bağlantısız)
protokol: İnternet Protokolü (IP) için 0 olan protokol değeri. Bu, bir paketin IP başlığındaki protokol alanında görünen sayıyla aynıdır. (daha fazla ayrıntı için man protocols)
2. Setsockopt
Bu, sockfd dosya tanımlayıcısı tarafından başvurulan soket için seçeneklerin düzenlenmesine yardımcı olur. Bu tamamen isteğe bağlıdır, ancak adres ve portun yeniden kullanılmasına yardımcı olur. "Adres zaten kullanımda" gibi hataları önler.
int setsockopt(int sockfd, int level, int int optname, const void *optval, socklen_t optlen);
3. Bağlamak
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Soket oluşturulduktan sonra, bind fonksiyonu soketi addr(özel veri yapısı)'nda belirtilen adrese ve port numarasına bağlar. Örnek kodda, sunucuyu localhost'a bağlarız, dolayısıyla IP adresini belirtmek için INADDR_ANY kullanırız.
4. Dinle
int listen(int sockfd, int backlog);
Sunucu soketini, istemcinin bağlantı kurmak için sunucuya yaklaşmasını beklediği pasif bir moda sokar. Geri bildirim, sockfd için bekleyen bağlantıların kuyruğunun büyüyebileceği maksimum uzunluğu tanımlar. Kuyruk doluyken bir bağlantı isteği gelirse, istemci ECONNREFUSED göstergesi olan bir hata alabilir.
5. Kabul et
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
Dinleme soketi sockfd için bekleyen bağlantılar kuyruğundaki ilk bağlantı isteğini çıkarır, yeni bir bağlı soket oluşturur ve bu sokete atıfta bulunan yeni bir dosya tanımlayıcısı döndürür. Bu noktada, istemci ve sunucu arasında bağlantı kurulur ve veri aktarmaya hazırdırlar.
Müşteri için Aşamalar
1. Soket bağlantısı: Sunucunun soket oluşturma işlemiyle tamamen aynıdır
2. Bağlan: connect() sistem çağrısı, sockfd dosya tanımlayıcısı tarafından başvurulan soketi addr tarafından belirtilen adrese bağlar. Sunucunun adresi ve portu addr'de belirtilir.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Uygulama
Burada istemci/sunucu modelini göstermek için sunucu ve istemci arasında tek bir merhaba mesajı alışverişinde bulunuyoruz.
Sunucu Oluşturmak İçin C Programı
Server.c
C:
// Server side C program to demonstrate Socket
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 8080
int main(int argc, char const* argv[])
{
int server_fd, new_socket;
ssize_t valread;
struct sockaddr_in address;
int opt = 1;
socklen_t addrlen = sizeof(address);
char buffer[1024] = { 0 };
char* hello = "Hello from server";
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
if (setsockopt(server_fd, SOL_SOCKET,
SO_REUSEADDR | SO_REUSEPORT, &opt,
sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr*)&address,
sizeof(address))
< 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket
= accept(server_fd, (struct sockaddr*)&address,
&addrlen))
< 0) {
perror("accept");
exit(EXIT_FAILURE);
}
valread = read(new_socket, buffer,
1024 - 1); // subtract 1 for the null
// terminator at the end
printf("%s\n", buffer);
send(new_socket, hello, strlen(hello), 0);
printf("Merhaba Mesajı Yolla.\n");
close(new_socket);
close(server_fd);
return 0;
}
İstemci Oluşturmak İçin C Programı
Customer.c
C:
// Client side C program to demonstrate Socket
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 8080
int main(int argc, char const* argv[])
{
int status, valread, client_fd;
struct sockaddr_in serv_addr;
char* hello = "Hello from client";
char buffer[1024] = { 0 };
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Soket Oluşturma Hatası \n");
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)
<= 0) {
printf(
"\nInvalid address/ Address not supported \n");
return -1;
}
if ((status
= connect(client_fd, (struct sockaddr*)&serv_addr,
sizeof(serv_addr)))
< 0) {
printf("\n Bağlantı Hatası \n");
return -1;
}
send(client_fd, hello, strlen(hello), 0);
printf("Merhaba Mesajı Yolla.\n");
valread = read(client_fd, buffer,
1024 - 1);
printf("%s\n", buffer);
close(client_fd);
return 0;
}
Çıktı
Client:Hello message sent
Hello from server
Server:Hello from client
Hello message sent
Derleme
gcc client.c -o client
gcc server.c -o server