В днешния свят компютърните мрежи играят важна роля в областта на преноса на данни. Това е тема, която всеки програмист трябва да познава. В компютърната мрежа програмирането на сокет е една от най-важните теми в света на програмирането. В тази тема ще обсъдим програмирането на сокет и различния метод за програмиране на сокет, който е имплементиран в C++.
В C++ програмирането на сокет е метод, който комбинира два или повече възли един с друг в мрежа, така че възлите да могат да споделят данните без загуба на данни. В тази връзка един възел слуша един порт, който е свързан към определен IP адрес. Когато клиентът достигне сървъра, сървърът създава слушателя на сокета.
Какво е Socket?
Нека разберем за сокета, като говорим за примера в реално време. Гнездото е вид носител, който осигурява връзка между две устройства. Гнездото може да бъде или зарядно за телефон, което осигурява връзката между контакта и телефона, или телефона и този лаптоп. С помощта на сокет различни приложения се свързват към локалната мрежа с различни портове. Всеки път, когато се създава сокетът, сървърът посочва програмата и тази програма посочва сокета и адреса на домейна.
Сокетът е вид механизъм, който се използва за обмен на данни между различни процеси. Тук тези процеси присъстват или в различни устройства, или в едно и също устройство, които са свързани в мрежа. След като връзката за сокета е създадена, тогава данните могат да бъдат изпратени в двете посоки и продължават, докато една от крайните точки затвори връзката.
Процедура при комуникация клиент-сървър
Има някои процедури, които трябва да следваме, за да установим комуникация клиент-сървър. Те са както следва.
Етапи за създаване на сървърен сокет
Има няколко етапа, чрез които можем да създадем сокет за сървъра. Те са както следва.
Какво е връзка?
Връзката е вид връзка между две машини, при която двата софтуера са известни един за друг. Тези два софтуера знаят как да установят връзка един с друг; с други думи, можем да кажем, че тези два софтуера знаят как да изпращат битовете по мрежата. Връзката на сокета означава, че двете машини трябва да знаят цялата информация помежду си, като телефонния номер, IP адреса и TCP порта.
Сокетът е тип обект, който е подобен на файла, който позволява на програмата да приеме входящата връзка и да им позволи да изпращат или получават входящата връзка. Също така, това е вид ресурс, присвоен на процеса на сървъра.
Сървърът може да създаде сокет с помощта на socket(). Този сокет не може да се споделя с друг процесор.
Етапи за клиента
- Гнездото, на което данните могат да се комуникират помежду си.
- Буферът за съхранение може да съхранява данни за адреса, като addr_of_data и addr_of_buffer.
- Той се занимава с размера на буфера, като len_of_data и len_of_buffer.
- Той се занимава с флага, който казва как ще бъдат изпратени данните.
Стъпки за установяване на връзката в гнездото
Той установява връзка между различните клиенти и сървъра. Но както клиентът, така и сървърът могат да се справят със сокет връзката. Всеки процес трябва да установи връзка за свой собствен сокет.
Стъпките, включени в установяването на сокет от страна на клиента, са както следва:
- Той създава сокет с помощта на системно извикване socket().
- След това трябва да се свържем с адреса на сокета на сървъра с помощта на системно() извикване.
- След това трябва да изпратим и получим данните. Можем да направим това по различни начини. можем да направим тази функция 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)>