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.
İ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.
Sunucu Soketi Oluşturma Aşamaları
Sunucunun soketini oluşturabileceğimiz bazı aşamalar bulunmaktadır. Bunlar aşağıdaki gibidir.
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.
Müşteriye Yönelik Aşamalar
- 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 = 'Hello from client'; 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)>