logo

Програмиране на сокет в C/C++

В днешния свят компютърните мрежи играят важна роля в областта на преноса на данни. Това е тема, която всеки програмист трябва да познава. В компютърната мрежа програмирането на сокет е една от най-важните теми в света на програмирането. В тази тема ще обсъдим програмирането на сокет и различния метод за програмиране на сокет, който е имплементиран в C++.

В C++ програмирането на сокет е метод, който комбинира два или повече възли един с друг в мрежа, така че възлите да могат да споделят данните без загуба на данни. В тази връзка един възел слуша един порт, който е свързан към определен IP адрес. Когато клиентът достигне сървъра, сървърът създава слушателя на сокета.

Какво е Socket?

Нека разберем за сокета, като говорим за примера в реално време. Гнездото е вид носител, който осигурява връзка между две устройства. Гнездото може да бъде или зарядно за телефон, което осигурява връзката между контакта и телефона, или телефона и този лаптоп. С помощта на сокет различни приложения се свързват към локалната мрежа с различни портове. Всеки път, когато се създава сокетът, сървърът посочва програмата и тази програма посочва сокета и адреса на домейна.

Сокетът е вид механизъм, който се използва за обмен на данни между различни процеси. Тук тези процеси присъстват или в различни устройства, или в едно и също устройство, които са свързани в мрежа. След като връзката за сокета е създадена, тогава данните могат да бъдат изпратени в двете посоки и продължават, докато една от крайните точки затвори връзката.

Програмиране на сокет в C/C++

Процедура при комуникация клиент-сървър

Има някои процедури, които трябва да следваме, за да установим комуникация клиент-сървър. Те са както следва.

    Гнездо:С помощта на сокет можем да създадем нова комуникация.Обвързване:С помощта на това можем, можем да прикрепим локалния адрес към сокета.Слушам:С тази помощ; можем да приемем връзката.Приеми:С тази помощ; можем да блокираме входящата връзка, докато пристигне заявката.Свързване:С тази помощ; можем да се опитаме да установим връзката.Изпрати:С помощта на това; можем да изпратим данните по мрежата.Получаване:С тази помощ; можем да получаваме данните по мрежата.Близо:С помощта на това можем да освободим връзката от мрежата.

Етапи за създаване на сървърен сокет

Има няколко етапа, чрез които можем да създадем сокет за сървъра. Те са както следва.

    int socketcr:Сокет (домейн, тип, протокол)Socketcr:Това е цяло число и е като манипулатор на файлове.Домейн:Това е комуникационен домейн и е целочислен тип.Тип:Това е комуникационен тип.SOCK_DGRAM:Това е вид UDP, който е ненадежден и без връзка.Протокол:Използва се за присвояване на стойността на протокола за IP адреса, който е 0. Стойността на протокола е подобна на стойността, появяваща се в полето за протокол на IP хедъра на джоба.

Какво е връзка?

Връзката е вид връзка между две машини, при която двата софтуера са известни един за друг. Тези два софтуера знаят как да установят връзка един с друг; с други думи, можем да кажем, че тези два софтуера знаят как да изпращат битовете по мрежата. Връзката на сокета означава, че двете машини трябва да знаят цялата информация помежду си, като телефонния номер, IP адреса и TCP порта.

Сокетът е тип обект, който е подобен на файла, който позволява на програмата да приеме входящата връзка и да им позволи да изпращат или получават входящата връзка. Също така, това е вид ресурс, присвоен на процеса на сървъра.

Сървърът може да създаде сокет с помощта на socket(). Този сокет не може да се споделя с друг процесор.

    Setsockopt:С помощта на Setsockopt можем да манипулираме различните опции на сокета, които са посочени от файловия дескриптор на сокета. Този процес е напълно незадължителен. С помощта на Setsockopt можем да използваме повторно порта и адреса на клиента и сървъра. Когато сървърът даде грешка „адрес вече се използва“, можем да го предотвратим с помощта на Setsockopt.Обвързване:Можем да обвържем сокета с адреса и порта с помощта на функцията за свързване. Тази операция се извършва след създаването на сокета. Например, ако се опитаме да свържем сървъра с локалния хост, тогава използваме INADDR_ANY, за да дефинираме IP адреса на сървъра.Слушам:Можем да направим гнездо за режим на връзка с помощта на функцията listening to (). Пример за сокет за режим на връзка е SOCK_STREAM. Това може да се дефинира от аргумента socket. Това се използва за приемане на входящата връзка, извършване на операцията на опашката за входящата връзка и изпълнение на изоставането на входящата връзка. Когато входяща връзка поиска от сървъра потвърждение, сокетът се поставя в пасивен режим. Параметърът за изоставане на сървъра се отнася до факта, че той не може да позволи повече от една връзка към сървъра наведнъж. Ако има някаква входяща връзка и опашката е пълна, тогава сървърът предоставя грешката с индикация „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().
  • След това трябва да се свържем с адреса на сокета на сървъра с помощта на системно() извикване.
  • След това трябва да изпратим и получим данните. Можем да направим това по различни начини. можем да направим тази функция 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)>