logo

Програмування сокетів на C/C++

У сучасному світі комп'ютерні мережі відіграють важливу роль у сфері передачі даних. Це тема, яку повинен знати кожен програміст. У комп’ютерній мережі програмування сокетів є однією з найважливіших тем у світі програмування. У цій темі ми обговорюємо програмування сокетів і інший метод програмування сокетів, реалізований у C++.

У C++ програмування сокетів — це метод, який об’єднує два або більше вузлів один з одним через мережу, щоб вузли могли обмінюватися даними без втрати даних. У цьому зв'язку один вузол слухає один порт, який підключений до певної IP-адреси. Коли клієнт досягає сервера, сервер створює прослуховувач сокетів.

Що таке сокет?

Давайте розберемося з сокетом на прикладі реального часу. Розетка – це тип носія, який забезпечує з’єднання між двома пристроями. Розетка може бути або зарядним пристроєм для телефону, який забезпечує з’єднання між розеткою та телефоном, або телефоном і цим ноутбуком. За допомогою сокета різні програми підключаються до локальної мережі з різними портами. Щоразу, коли створюється сокет, сервер вказує програму, а ця програма вказує сокет і адресу домену.

Сокет — це тип механізму, який використовується для обміну даними між різними процесами. Тут ці процеси присутні або в різних пристроях, або в одному пристрої, підключеному через мережу. Після створення з’єднання для сокета дані можуть надсилатися в обох напрямках і триватимуть, доки одна з кінцевих точок не закриє з’єднання.

Програмування сокетів на C/C++

Процедура зв’язку клієнт-сервер

Є деякі процедури, яких ми повинні дотримуватися, щоб встановити зв’язок клієнт-сервер. Це такі.

    Розетка:За допомогою сокета ми можемо створити нове спілкування.Прив'язати:За допомогою цього ми можемо приєднати локальну адресу до сокета.Слухай:За допомогою цієї допомоги; ми можемо прийняти підключення.Прийняти:За допомогою цієї допомоги; ми можемо заблокувати вхідне з'єднання, поки не надійде запит.Підключити:За допомогою цієї допомоги; ми можемо спробувати встановити зв'язок.Надіслати:За допомогою цього; ми можемо надсилати дані через мережу.Отримати:За допомогою цієї допомоги; ми можемо отримувати дані через мережу.Закрити:За допомогою цього ми можемо розірвати з’єднання з мережею.

Етапи створення серверного сокета

Є кілька етапів, за допомогою яких ми можемо створити сокет для сервера. Це такі.

    int socketcr:Сокет (домен, тип, протокол)Socketcr:Це цілочисельний тип і схожий на обробник файлів.Домен:Це комунікаційний домен і цілочисельний тип.тип:Це тип спілкування.SOCK_DGRAM:Це тип UDP, який є ненадійним і не має з’єднання.Протокол:Він використовується для призначення значення протоколу для IP-адреси, яке дорівнює 0. Значення протоколу подібне до значення, яке відображається в полі протоколу IP-заголовка кишені.

Що таке з'єднання?

З’єднання – це тип зв’язку між двома машинами, коли два програмних забезпечення знають одне про одного. Ці два програмні засоби знають, як встановити зв’язок один з одним; іншими словами, ми можемо сказати, що ці дві програми знають, як надсилати біти через мережу. Підключення через сокет означає, що дві машини повинні знати всю інформацію між собою, як-от номер телефону, IP-адресу та порт TCP.

Сокет — це тип об’єкта, схожий на файл, який дозволяє програмі приймати вхідне з’єднання та надсилати або отримувати вхідне з’єднання. Крім того, це тип ресурсу, призначеного процесу сервера.

Сервер може створити сокет за допомогою socket(). Цей сокет не можна використовувати спільно з жодним іншим процесором.

    Setsockopt:За допомогою Setsockopt ми можемо маніпулювати різними опціями сокета, на які посилається дескриптор файлу сокета. Цей процес абсолютно необов’язковий. За допомогою Setsockopt ми можемо повторно використовувати порт і адресу клієнта та сервера. Коли сервер видає помилку «адреса вже використовується», ми можемо запобігти цьому за допомогою Setsockopt.Прив'язати:Ми можемо зв’язати сокет з адресою та портом за допомогою функції bind. Ця операція виконується після створення сокета. Наприклад, якщо ми намагаємося прив’язати сервер до локального хосту, ми використовуємо INADDR_ANY для визначення IP-адреси сервера.Слухай:Ми можемо створити сокет режиму підключення за допомогою функції listening to (). Прикладом сокета режиму підключення є SOCK_STREAM. Це може бути визначено аргументом socket. Це використовується для прийняття вхідного з’єднання, виконання операції в черзі для вхідного з’єднання та виконання резерву вхідного з’єднання. Коли вхідне підключення запитує сервер про підтвердження, сокет переходить у пасивний режим. Параметр backlog сервера стосується того факту, що він не може дозволити більше одного підключення до сервера одночасно. Якщо надійшло вхідне з’єднання, а чергу заповнено, сервер видає повідомлення про помилку з індикацією «ECONNREFUSED». За допомогою listen() вхідне з’єднання затримується, а коли черга порожня, викликає всі вхідні з’єднання до сервера.Прийняти:За допомогою системного виклику accept(); ми можемо створити сокет на основі підключення. Деякі сокети на основі з’єднання є SOCK_STREAM і SOCK_SEQPACKET. Він витягує всі вхідні з’єднання, які надходять першими, і дозволяє їхнім запитам відправлятися на сервер. Щойно підключений список не може слухати за допомогою іншого аргументу для створення нового сокета.

Етапи для клієнта

    Підключення до розетки:Це точно так само, як і спосіб створення сервера.Підключити:Ми можемо ініціювати підключення до сокета за допомогою системного виклику connect(). Якщо параметр для сокета є типом SOCK_DGRAM, тоді ми можемо визначити датаграму як постійну за допомогою connect(). Якщо сокет має тип SOCK_STREAM, ми можемо спробувати встановити інше з’єднання для сервера. За допомогою функції connect() ми також можемо створити з’єднання для іноземної асоціації. Якщо сокет не прив’язаний, то система присвоює унікальне значення локальній асоціації. Коли системний виклик успішно завершено, сокет готовий надсилати або отримувати будь-які типи даних.Надіслати/отримати:Функції send() і recv() можуть виконувати наведену нижче операцію.
  • Розетка, через яку дані можуть передаватись один одному.
  • Буфер зберігання може зберігати дані про адресу, наприклад addr_of_data і addr_of_buffer.
  • Він має справу з розміром буфера, наприклад len_of_data і len_of_buffer.
  • Він має справу з прапором, який говорить, як дані будуть надіслані.

Кроки для встановлення з’єднання в розетці

Він встановлює з’єднання між різними клієнтами та сервером. Але як клієнт, так і сервер можуть працювати з підключенням через сокет. Кожен процес має встановити з’єднання для свого власного сокета.

Кроки, пов’язані зі встановленням сокета на стороні клієнта, такі:

  • Він створює сокет за допомогою системного виклику socket().
  • Потім ми повинні підключитися до адреси сокета сервера за допомогою виклику system().
  • Потім ми повинні відправити та отримати дані. Ми можемо зробити це різними способами. ми можемо виконати цю функцію read() і write().

Для встановлення сокета на стороні сервера виконайте наведені нижче дії.

  • Спочатку створюється сокет за допомогою системного виклику socket().
  • Потім він прив’язує сокет до адреси за допомогою системного виклику bind(). Адреса складається з номера порту для сокета сервера на головній машині.
  • Потім він прослуховує з'єднання за допомогою системного виклику listening ().
  • Потім сервер приймає вхідне з'єднання за допомогою системного виклику accept(). Він також блокує всі вхідні команди, доки клієнт не підключиться до сервера.
  • Потім починається процес надсилання та отримання даних.

Підключення кількох клієнтів без багатопоточності

Є різні приклади, в яких ми бачимо, як один користувач може підключитися до сервера. У сучасному світі програмування декілька користувачів підключені до сервера за допомогою різних сокетів.

Існують різні способи досягти цього. Одним з них є багатопотоковість. За допомогою багатопоточності ми можемо досягти цього. Ми можемо реалізувати багатопотоковий процес за допомогою функції select().

приклад:

Код для клієнта:

 // 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)>