logo

Soketové programování v C/C++

V dnešním světě hrají počítačové sítě důležitou roli v oblasti přenosu dat. Je to téma, které by měl znát každý programátor. V počítačové síti je programování socketů jedním z nejdůležitějších témat ve světě programování. V tomto tématu se zabýváme programováním socketů a různými metodami programování socketů, které jsou implementovány v C++.

V C++ je programování soketů metodou, která kombinuje dva nebo více uzlů navzájem přes síť, takže uzly mohou sdílet data bez jakékoli ztráty dat. V tomto spojení jeden uzel naslouchá jednomu portu, který je připojen k určité IP adrese. Když klient dosáhne serveru, server vytvoří posluchač soketu.

Co je to zásuvka?

Pojďme pochopit zásuvku na příkladu v reálném čase. Zásuvka je typ média, které zajišťuje spojení mezi dvěma zařízeními. Zásuvka může být buď nabíječka telefonu, která zajišťuje spojení mezi zásuvkou a telefonem, nebo telefonem a tímto notebookem. Pomocí zásuvky jsou k místní síti připojeny různé aplikace s různými porty. Pokaždé, když je soket vytvořen, server specifikuje program a tento program specifikuje soket a adresu domény.

Soket je typ mechanismu, který se používá k výměně dat mezi různými procesy. Zde jsou tyto procesy přítomny buď v různých zařízeních, nebo ve stejném zařízení, které je připojeno přes síť. Jakmile je spojení pro soket vytvořeno, lze data odesílat oběma směry a pokračovat, dokud jeden z koncových bodů spojení neuzavře.

Soketové programování v C/C++

Postup v komunikaci klient-server

Existují určité postupy, které musíme dodržovat, abychom navázali komunikaci klient-server. Ty jsou následující.

    Zásuvka:Pomocí zásuvky můžeme vytvořit novou komunikaci.Svázat:S pomocí toho můžeme, můžeme připojit místní adresu se socketem.Poslouchat:S touto pomocí; můžeme přijmout spojení.Akceptovat:S touto pomocí; můžeme zablokovat příchozí spojení, dokud nepřijde požadavek.Připojit:S touto pomocí; můžeme zkusit navázat spojení.Poslat:S pomocí tohoto; můžeme data posílat po síti.Dostávat:S touto pomocí; můžeme přijímat data přes síť.Zavřít:Pomocí toho můžeme uvolnit spojení ze sítě.

Fáze pro vytvoření serverového soketu

Existuje několik fází, ve kterých můžeme vytvořit soket pro server. Ty jsou následující.

převod int na řetězec
    int socketcr:Socket (doména, typ, protokol)Socketcr:Je to celočíselný typ a je jako obslužný program souboru.Doména:Je to komunikační doména a je to celočíselný typ.Typ:Je to komunikační typ.SOCK_DGRAM:Je to typ UDP, který je nespolehlivý a nespojitelný.Protokol:Slouží k přiřazení hodnoty protokolu pro IP adresu, která je 0. Hodnota protokolu je podobná hodnotě zobrazené v poli protokolu v hlavičce IP kapsy.

Co je připojení?

Spojení je typ vztahu mezi dvěma stroji, kde jsou dva software o sobě navzájem známé. Tyto dva software vědí, jak navázat spojení mezi sebou; jinými slovy, můžeme říci, že tyto dva software vědí, jak posílat bity po síti. Spojení soketu znamená, že oba stroje by měly znát všechny informace mezi sebou, jako je telefonní číslo, IP adresa a TCP port.

Soket je typ objektu, který je podobný souboru, který umožňuje programu přijmout příchozí připojení a umožnit mu odesílat nebo přijímat příchozí připojení. Je to také typ zdroje přiřazeného k procesu serveru.

Server může vytvořit soket pomocí funkce socket(). Tento socket nelze sdílet s žádným jiným procesorem.

    Setsockopt:S pomocí Setsockopt můžeme manipulovat s různými možnostmi soketu, na které se odkazuje deskriptor souboru soketu. Tento proces je zcela volitelný. S pomocí Setsockopt můžeme znovu použít port a adresu klienta a serveru. Když server zobrazí chybu „adresa se již používá“, můžeme jí zabránit pomocí Setsockopt.Svázat:Soket můžeme svázat s adresou a portem pomocí funkce bind. Tato operace se provádí po vytvoření soketu. Pokud se například pokusíme svázat server s místním hostitelem, použijeme INADDR_ANY k definování IP adresy serveru.Poslouchat:Pomocí funkce poslechu () můžeme vytvořit zásuvku režimu připojení. Příkladem soketu režimu připojení je SOCK_STREAM. To lze definovat argumentem socket. To se používá k přijetí příchozího připojení, provedení operace fronty pro příchozí připojení a provedení nevyřízeného záznamu příchozího připojení. Když příchozí spojení požaduje od serveru potvrzení, soket se přepne do pasivního režimu. Parametr backlog serveru odkazuje na skutečnost, že nemůže povolit více než jedno připojení k serveru najednou. Pokud došlo k nějakému příchozímu spojení a fronta je plná, server zobrazí chybu s indikací „ECONNREFUSED“. S pomocí listen() je příchozí spojení pozastaveno, a když je fronta prázdná, volá všechna příchozí spojení na server.Akceptovat:S pomocí systémového volání accept(); můžeme vytvořit zásuvku založenou na připojení. Některé sokety založené na připojení jsou SOCK_STREAM a SOCK_SEQPACKET. Extrahuje všechna příchozí připojení, která přicházejí jako první, a umožňuje jejich požadavek přejít na server. Nově připojený seznam není schopen naslouchat pomocí jiného argumentu pro vytvoření nového soketu.

Fáze pro klienta

    Zásuvkové připojení:Je to úplně stejné jako způsob vytvoření serveru.Připojit:Spojení se soketem můžeme iniciovat pomocí systémového volání connect(). Pokud je parametrem pro socket typ SOCK_DGRAM, pak můžeme datagram definovat jako trvalý pomocí connect(). Pokud je soket typu SOCK_STREAM, můžeme se pokusit vytvořit další připojení k serveru. Pomocí funkce connect() můžeme také vytvořit spojení pro zahraniční asociaci. Pokud není soket svázán, systém přiřadí jedinečnou hodnotu místnímu přidružení. Po úspěšném dokončení volání systému je soket připraven k odesílání nebo přijímání jakéhokoli typu dat.Odeslat/přijmout:Funkce send() a recv() mohou provádět níže uvedenou operaci.
  • Zásuvka, na které lze data vzájemně komunikovat.
  • Vyrovnávací paměť úložiště může ukládat data o adrese, jako je addr_of_data a addr_of_buffer.
  • Zabývá se velikostí vyrovnávací paměti, jako je len_of_data a len_of_buffer.
  • Zabývá se příznakem, který říká, jak budou data odeslána.

Kroky k vytvoření připojení v zásuvce

Naváže spojení mezi různými klienty a serverem. Ale jak klient, tak server zvládnou soketové připojení. Každý proces musí vytvořit připojení pro svůj vlastní soket.

Kroky spojené s vytvořením soketu na straně klienta jsou následující:

  • Vytváří soket pomocí systémového volání socket().
  • Poté se musíme spojit s adresou soketu serveru pomocí volání system().
  • Poté musíme data odeslat a přijmout. Můžeme to udělat různými způsoby. můžeme provést tuto funkci read() a write().

Kroky spojené s vytvořením soketu na straně serveru jsou následující:

  • Nejprve vytvoří soket pomocí systémového volání socket().
  • Poté sváže soket s adresou pomocí systémového volání bind(). Adresa se skládá z čísla portu pro serverový soket v hostitelském počítači.
  • Poté naslouchá na spojení pomocí systémového volání naslouchání ().
  • Poté server přijme příchozí spojení pomocí systémového volání accept(). Blokuje také všechny příchozí příkazy, dokud není klient připojen k serveru.
  • Poté se spustí proces odesílání a přijímání dat.

Připojení více klientů bez multithreadingu

Existují různé příklady, ve kterých vidíme, jak se jeden uživatel může připojit k serveru. V dnešním programovacím světě je k serveru připojeno více uživatelů s různými sokety.

Toho lze dosáhnout různými způsoby. Jedním z nich je multithreading. Pomocí multithreadingu toho můžeme dosáhnout. Vícevláknový proces můžeme implementovat pomocí funkce select().

binární strom v Javě

Příklad:

Kód pro klienta:

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