logo

C/C++'da Soket Programlama

Günümüz dünyasında veri aktarım alanında bilgisayar ağları önemli bir rol oynamaktadır. Her programcının bilmesi gereken bir konudur. Bilgisayar ağı altında soket programlama, programlama dünyasının en önemli konularından biridir. Bu başlıkta soket programlamayı ve C++'da uygulanan farklı soket programlama yöntemlerini tartışacağız.

C++'da soket programlama, iki veya daha fazla düğümü bir ağ üzerinden birbiriyle birleştirerek düğümlerin herhangi bir veri kaybı olmadan verileri paylaşabilmesini sağlayan bir yöntemdir. Bu bağlantıda bir düğüm, belirli bir IP adresine bağlı olan bir bağlantı noktasını dinler. İstemci sunucuya ulaştığında sunucu soket dinleyicisini oluşturur.

Soket Nedir?

Gerçek zamanlı örnekten konuşarak soketi anlayalım. Soket, iki cihaz arasında bağlantı sağlayan bir ortam türüdür. Soket, soket ile telefon arasındaki bağlantıyı sağlayan bir telefon şarj cihazı olabileceği gibi, telefon ile o dizüstü bilgisayar arasındaki bağlantıyı da sağlayabilir. Bir soket yardımıyla yerel ağa farklı portlarla farklı uygulamalar bağlanır. Soket her oluşturulduğunda, sunucu programı belirtir ve bu program da soketi ve etki alanı adresini belirtir.

Soket, farklı işlemler arasında veri alışverişi yapmak için kullanılan bir mekanizma türüdür. Burada bu işlemler ya farklı cihazlarda ya da bir ağ üzerinden bağlanan aynı cihazda mevcuttur. Soket bağlantısı oluşturulduktan sonra veriler her iki yönde de gönderilebilir ve uç noktalardan biri bağlantıyı kapatana kadar devam eder.

C/C++'da Soket Programlama

İstemci-Sunucu İletişiminde Prosedür

İstemci-sunucu iletişimini kurmak için izlememiz gereken bazı prosedürler vardır. Bunlar aşağıdaki gibidir.

    Priz:Soket yardımıyla yeni bir iletişim oluşturabiliriz.Bağla:Bunun yardımıyla yerel adresi sokete ekleyebiliriz.Dinlemek:Bu yardımla; bağlantıyı kabul edebiliriz.Kabul etmek:Bu yardımla; istek gelene kadar gelen bağlantıyı engelleyebiliriz.Bağlamak:Bu yardımla; bağlantıyı kurmayı deneyebiliriz.Göndermek:Bunun yardımıyla; verileri ağ üzerinden gönderebiliriz.Almak:Bu yardımla; verileri ağ üzerinden alabiliriz.Kapalı:Bunun yardımıyla bağlantıyı ağdan kaldırabiliriz.

Sunucu Soketi Oluşturma Aşamaları

Sunucunun soketini oluşturabileceğimiz bazı aşamalar bulunmaktadır. Bunlar aşağıdaki gibidir.

    int soketi:Soket(etki alanı, tür, protokol)Soket cr:Bir tamsayı türüdür ve bir dosya işleyicisine benzer.İhtisas:Bu bir iletişim alanıdır ve bir tam sayı türüdür.Tip:Bir iletişim türüdür.SOCK_DGRAM:Güvenilmez ve bağlantısız bir UDP türüdür.Protokol:IP adresi için 0 olan protokol değerini atamak için kullanılır. Protokol değeri, cebin IP başlığının protokol alanında görünen değere benzer.

Bağlantı Nedir?

Bağlantı, iki yazılımın birbirleri hakkında bilindiği iki makine arasındaki bir tür ilişkidir. Bu iki yazılım birbiriyle nasıl bağlantı kuracağını biliyor; yani bu iki yazılımın bitleri ağ üzerinden nasıl göndereceğini bildiğini söyleyebiliriz. Soket bağlantısı, iki makinenin telefon numarası, IP adresi ve TCP bağlantı noktası gibi birbirleri arasındaki tüm bilgileri bilmesi gerektiği anlamına gelir.

Soket, programın gelen bağlantıyı kabul etmesine ve gelen bağlantıyı göndermesine veya almasına izin veren, dosyaya benzeyen bir nesne türüdür. Ayrıca sunucunun sürecine atanan bir kaynak türüdür.

Sunucu, soket() yardımıyla soketi oluşturabilir. Bu soket başka bir işlemciyle paylaşılamaz.

    Setsockopt:Setsockopt'un yardımıyla, soketin dosya tanımlayıcısı tarafından belirtilen çeşitli soket seçeneklerini değiştirebiliriz. Bu işlem tamamen isteğe bağlıdır. Setsockopt yardımıyla client ve sunucunun port ve adresini tekrar kullanabiliyoruz. Sunucu 'adres zaten kullanımda' hatası verdiğinde Setsockopt yardımıyla bunu önleyebiliriz.Bağla:Bind fonksiyonu yardımıyla soketi adrese ve porta bağlayabiliriz. Bu işlem soket oluşturulduktan sonra yapılır. Örneğin, sunucuyu yerel ana bilgisayara bağlamaya çalışırsak sunucunun IP adresini tanımlamak için INADDR_ANY kullanırız.Dinlemek:Listen to () fonksiyonu yardımıyla bağlantı modu soketi yapabiliriz. Bağlantı modu soketine örnek olarak SOCK_STREAM verilebilir. Bu, soket argümanı ile tanımlanabilir. Bu, gelen bağlantıyı kabul etmek, gelen bağlantı için kuyruk işlemini gerçekleştirmek ve gelen bağlantının biriktirme işlemini gerçekleştirmek için kullanılır. Gelen bir bağlantı sunucudan onay istediğinde soket pasif moda alınır. Sunucunun backlog parametresi, sunucuya aynı anda birden fazla bağlantıya izin verilemeyeceğini ifade eder. Gelen bir bağlantı gelmişse ve sıra doluysa, sunucu hatayı ' ECONNREFUSED' göstergesiyle sunar. Listen()'ın yardımıyla gelen bağlantı beklemeye alınır ve sıra boşaldığında sunucuya gelen tüm bağlantıları çağırır.Kabul etmek:Accept() sistem çağrısının yardımıyla; bağlantı tabanlı soket yapabiliriz. Bazı bağlantı tabanlı soketler SOCK_STREAMan ve SOCK_SEQPACKET'tir. İlk gelen tüm gelen bağlantıları çıkarır ve isteklerinin sunucuya gitmesine izin verir. Yeni bağlanan liste, yeni soketin oluşturulması için başka bir argümanın yardımıyla dinlenemez.

Müşteriye Yönelik Aşamalar

    Soket bağlantısı:Sunucunun oluşturulma yöntemiyle tamamen aynıdır.Bağlamak:Connect() sistem çağrısı yardımıyla sokete bağlantı başlatabiliriz. Soketin parametresi bir tür SOCK_DGRAM ise, connect() yardımıyla datagramı kalıcı olarak tanımlayabiliriz. Soket SOCK_STREAM tipindeyse sunucu için başka bir bağlantı kurmayı deneyebiliriz. Connect() fonksiyonunun yardımıyla yabancı dernek için de bağlantı oluşturabiliriz. Soket ilişkisizse, sistem benzersiz değeri yerel ilişkilendirmeye atar. Sistem çağrıları başarıyla tamamladığında, soket her türlü veriyi göndermeye veya almaya hazırdır.Gönder/Al:send() ve recv() işlevleri aşağıdaki işlemi gerçekleştirebilir.
  • Verilerin birbirleriyle iletişim kurabildiği soket.
  • Depolama arabelleği, addr_of_data ve addr_of_buffer gibi adres hakkındaki verileri depolayabilir.
  • Len_of_data ve len_of_buffer gibi arabelleğin boyutuyla ilgilenir.
  • Verilerin nasıl gönderileceğini belirten bayrakla ilgilenir.

Sokette Bağlantı Kurma Adımları

Farklı istemciler ve sunucu arasında bağlantı kurar. Ancak hem istemci hem de sunucu soket bağlantısını işleyebilir. Her prosesin kendi soketi için bağlantı kurması gerekir.

İstemci tarafında bir soket kurmanın adımları aşağıdaki gibidir:

  • Socket() sistem çağrısının yardımıyla bir soket oluşturur.
  • Daha sonra system() çağrısı yardımıyla sunucunun soket adresine bağlanmamız gerekiyor.
  • Daha sonra verileri gönderip almamız gerekiyor. Bunu çeşitli şekillerde yapabiliriz. bu read() ve write() işlevini yapabiliriz.

Sunucu tarafında soket kurma adımları aşağıdaki gibidir:

  • İlk önce bir soket() sistem çağrısının yardımıyla bir soket oluşturur.
  • Daha sonrabind() sistem çağrısının yardımıyla soketi bir adrese bağlar. Adres, ana makinedeki sunucu soketinin bağlantı noktası numarasından oluşur.
  • Daha sonra dinleme () sistem çağrısı yardımıyla bağlantıyı dinler.
  • Daha sonra sunucu, Accept() sistem çağrısının yardımıyla gelen bağlantıyı kabul eder. Ayrıca bir istemci bir sunucuya bağlanana kadar gelen tüm komutları da engeller.
  • Daha sonra veri gönderme ve alma süreci başlar.

Çoklu İş Parçacığı Olmadan Birden Çok İstemciyi Bağlama

Tek bir kullanıcının sunucuya nasıl bağlanabileceğini gördüğümüz çeşitli örnekler var. Günümüz programlama dünyasında birden fazla kullanıcı farklı soketlerle sunucuya bağlanmaktadır.

Bunu başarmanın çeşitli yolları vardır. Bunlardan biri çoklu iş parçacığıdır. Çoklu iş parçacığı yardımıyla bunu başarabiliriz. Select() fonksiyonu yardımıyla çoklu iş parçacıklı bir işlem gerçekleştirebiliriz.

Örnek:

Müşteri için kod:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>