У сучасному світі комп'ютерні мережі відіграють важливу роль у сфері передачі даних. Це тема, яку повинен знати кожен програміст. У комп’ютерній мережі програмування сокетів є однією з найважливіших тем у світі програмування. У цій темі ми обговорюємо програмування сокетів і інший метод програмування сокетів, реалізований у C++.
У C++ програмування сокетів — це метод, який об’єднує два або більше вузлів один з одним через мережу, щоб вузли могли обмінюватися даними без втрати даних. У цьому зв'язку один вузол слухає один порт, який підключений до певної IP-адреси. Коли клієнт досягає сервера, сервер створює прослуховувач сокетів.
Що таке сокет?
Давайте розберемося з сокетом на прикладі реального часу. Розетка – це тип носія, який забезпечує з’єднання між двома пристроями. Розетка може бути або зарядним пристроєм для телефону, який забезпечує з’єднання між розеткою та телефоном, або телефоном і цим ноутбуком. За допомогою сокета різні програми підключаються до локальної мережі з різними портами. Щоразу, коли створюється сокет, сервер вказує програму, а ця програма вказує сокет і адресу домену.
Сокет — це тип механізму, який використовується для обміну даними між різними процесами. Тут ці процеси присутні або в різних пристроях, або в одному пристрої, підключеному через мережу. Після створення з’єднання для сокета дані можуть надсилатися в обох напрямках і триватимуть, доки одна з кінцевих точок не закриє з’єднання.
Процедура зв’язку клієнт-сервер
Є деякі процедури, яких ми повинні дотримуватися, щоб встановити зв’язок клієнт-сервер. Це такі.
Етапи створення серверного сокета
Є кілька етапів, за допомогою яких ми можемо створити сокет для сервера. Це такі.
Що таке з'єднання?
З’єднання – це тип зв’язку між двома машинами, коли два програмних забезпечення знають одне про одного. Ці два програмні засоби знають, як встановити зв’язок один з одним; іншими словами, ми можемо сказати, що ці дві програми знають, як надсилати біти через мережу. Підключення через сокет означає, що дві машини повинні знати всю інформацію між собою, як-от номер телефону, IP-адресу та порт TCP.
Сокет — це тип об’єкта, схожий на файл, який дозволяє програмі приймати вхідне з’єднання та надсилати або отримувати вхідне з’єднання. Крім того, це тип ресурсу, призначеного процесу сервера.
Сервер може створити сокет за допомогою socket(). Цей сокет не можна використовувати спільно з жодним іншим процесором.
Етапи для клієнта
- Розетка, через яку дані можуть передаватись один одному.
- Буфер зберігання може зберігати дані про адресу, наприклад 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 = '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)>