logo

Socket-ohjelmointi C/C++:ssa

Nykymaailmassa tietokoneverkoilla on tärkeä rooli tiedonsiirrossa. Se on aihe, joka jokaisen ohjelmoijan tulisi tietää. Tietokoneverkon alla socket-ohjelmointi on yksi ohjelmointimaailman tärkeimmistä aiheista. Tässä aiheessa käsittelemme socket-ohjelmointia ja erilaista socket-ohjelmointimenetelmää, joka on toteutettu C++:ssa.

C++:ssa socket-ohjelmointi on menetelmä, joka yhdistää kaksi tai useampia solmuja keskenään verkon yli, jotta solmut voivat jakaa tietoja ilman tietojen menetystä. Tässä yhteydessä yksi solmu kuuntelee yhtä porttia, joka on kytketty tiettyyn IP-osoitteeseen. Kun asiakas saavuttaa palvelimen, palvelin luo socket-kuuntelijan.

Mikä on pistorasia?

Ymmärretään pistorasiasta puhumalla reaaliaikainen esimerkki. Pistorasia on eräänlainen tietoväline, joka muodostaa yhteyden kahden laitteen välillä. Pistorasia voi olla joko puhelimen laturi, joka muodostaa yhteyden pistorasian ja puhelimen välillä tai puhelimen ja kannettavan tietokoneen välillä. Socketin avulla paikallisverkkoon liitetään erilaisia ​​sovelluksia eri porteilla. Joka kerta kun socket luodaan, palvelin määrittää ohjelman, ja tämä ohjelma määrittää socketin ja toimialueen osoitteen.

sanjay dutt ja

Socket on eräänlainen mekanismi, jota käytetään tietojen vaihtamiseen eri prosessien välillä. Tässä nämä prosessit ovat joko eri laitteissa tai samassa laitteessa, jotka on kytketty verkon kautta. Kun yhteys pistorasiaan on luotu, tiedot voidaan lähettää molempiin suuntiin ja jatkaa, kunnes jokin päätepisteistä sulkee yhteyden.

Socket-ohjelmointi C/C++:ssa

Toimenpide asiakkaan ja palvelimen välisessä viestinnässä

On joitain menettelytapoja, joita meidän on noudatettava luodaksemme asiakas-palvelin-viestinnän. Nämä ovat seuraavat.

    Pistorasia:Pistorasian avulla voimme luoda uuden viestinnän.Sitoa:Tämän avulla voimme liittää paikallisen osoitteen pistorasiaan.Kuunnella:Tämän avulla; voimme hyväksyä yhteyden.Hyväksyä:Tämän avulla; voimme estää saapuvan yhteyden, kunnes pyyntö saapuu.Kytkeä:Tämän avulla; voimme yrittää muodostaa yhteyden.Lähettää:Tämän avulla; voimme lähettää tiedot verkon kautta.Vastaanottaa:Tämän avulla; voimme vastaanottaa tiedot verkon kautta.Kiinni:Tämän avulla voimme vapauttaa yhteyden verkosta.

Server Socketin luomisen vaiheet

On olemassa joitakin vaiheita, joissa voimme luoda palvelimen socketin. Nämä ovat seuraavat.

    int socketcr:Socket (verkkotunnus, tyyppi, protokolla)Socketcr:Se on kokonaislukutyyppi, ja se on kuin tiedostokäsittelijä.Verkkotunnus:Se on viestintäalue ja se on kokonaislukutyyppi.Tyyppi:Se on viestintätyyppi.SOCK_DGRAM:Se on eräänlainen UDP, joka on epäluotettava ja yhteydetön.Protokolla:Sitä käytetään IP-osoitteen protokollaarvon määrittämiseen, joka on 0. Protokollan arvo on samanlainen kuin taskun IP-otsikon protokollakentässä näkyvä arvo.

Mikä on yhteys?

Yhteys on kahden koneen välinen suhde, jossa kaksi ohjelmistoa tunnetaan toisistaan. Nämä kaksi ohjelmistoa osaavat muodostaa yhteyden toisiinsa; toisin sanoen voimme sanoa, että nämä kaksi ohjelmistoa osaavat lähettää bittejä verkon yli. Socketin yhteys tarkoittaa, että kahden koneen pitäisi tietää kaikki tiedot keskenään, kuten puhelinnumero, IP-osoite ja TCP-portti.

yritä saada java kiinni

Socket on objektityyppi, joka on samanlainen kuin tiedosto, jonka avulla ohjelma voi hyväksyä saapuvan yhteyden ja lähettää tai vastaanottaa saapuvan yhteyden. Se on myös eräänlainen resurssi, joka on määritetty palvelimen prosessille.

Palvelin voi luoda socketin socket(:n) avulla. Tätä liitäntää ei voi jakaa minkään muun prosessorin kanssa.

    Setsockopt:Setsockoptin avulla voimme käsitellä socketin eri vaihtoehtoja, joihin socketin tiedostokuvaaja viittaa. Tämä prosessi on täysin valinnainen. Setsockoptin avulla voimme käyttää uudelleen asiakkaan ja palvelimen porttia ja osoitetta. Kun palvelin antaa virheilmoituksen 'osoite jo käytössä', voimme estää sen Setsockoptin avulla.Sitoa:Voimme sitoa socketin osoitteella ja portin bind-toiminnon avulla. Tämä toiminto suoritetaan pistorasian luomisen jälkeen. Jos esimerkiksi yritämme sitoa palvelimen paikalliseen isäntään, määritämme palvelimen IP-osoitteen parametrilla INADDR_ANY.Kuunnella:Voimme tehdä yhteystilapistokkeen kuuntelutoiminnon () avulla. Esimerkki yhteystilan pistokkeesta on SOCK_STREAM. Tämä voidaan määritellä socket-argumentilla. Tätä käytetään hyväksymään saapuva yhteys, suorittamaan saapuvan yhteyden jonotoiminto ja suorittamaan saapuvan yhteyden ruuhka. Kun saapuva yhteys pyytää palvelimelta kuittausta, socket siirtyy passiiviseen tilaan. Palvelimen backlog-parametri viittaa siihen, että se ei voi sallia useampaa kuin yhtä yhteyttä palvelimeen kerrallaan. Jos jokin saapuva yhteys on tullut ja jono on täynnä, palvelin antaa virheilmoituksen ECONNREFUSED-ilmoituksella. Listen() avulla saapuva yhteys on pidossa, ja kun jono on tyhjä, se kutsuu kaikki saapuvat yhteydet palvelimelle.Hyväksyä:Avulla accept() järjestelmäkutsu; voimme tehdä liitäntäpohjaisen pistorasian. Jotkut yhteyspohjaiset pistokkeet ovat SOCK_STREAMand SOCK_SEQPACKET. Se poimii kaikki saapuvat yhteydet, jotka tulevat ensin ja sallii heidän pyyntönsä mennä palvelimelle. Äskettäin yhdistetty lista ei pysty kuuntelemaan toisen argumentin avulla uuden pistokkeen luomiseksi.

Vaiheet asiakkaalle

    Pistorasialiitäntä:Se on täsmälleen sama kuin palvelimen luomismenetelmä.Kytkeä:Voimme muodostaa yhteyden pistorasiaan connect()-järjestelmäkutsun avulla. Jos socketin parametri on SOCK_DGRAM-tyyppi, voimme määrittää datagrammin pysyväksi connect(:n) avulla. Jos pistoke on tyyppiä SOCK_STREAM, voimme yrittää muodostaa toisen yhteyden palvelimelle. Connect()-funktion avulla voimme myös luoda yhteyden ulkomaiseen yhdistykseen. Jos kantaa ei ole sidottu, järjestelmä antaa yksilöllisen arvon paikalliselle yhteydelle. Kun järjestelmä soittaa onnistuneesti, socket on valmis lähettämään tai vastaanottamaan kaikentyyppisiä tietoja.Lähetä vastaanota:Send()- ja recv()-funktiot voivat suorittaa alla olevan toiminnon.
  • Vastake, jossa tiedot voidaan viestiä keskenään.
  • Tallennuspuskuri voi tallentaa tietoja osoitteesta, kuten addr_of_data ja addr_of_buffer.
  • Se käsittelee puskurin kokoa, kuten len_of_data ja len_of_buffer.
  • Se käsittelee lippua, joka kertoo kuinka tiedot lähetetään.

Vaiheet yhteyden muodostamiseksi pistorasiaan

Se muodostaa yhteyden eri asiakkaiden ja palvelimen välille. Mutta sekä asiakas että palvelin voivat käsitellä socket-yhteyden. Jokaisen prosessin on muodostettava yhteys omalle pistorasialleen.

Asiakaspuolen pistorasiaan liittyvät vaiheet ovat seuraavat:

  • Se luo socketin socket()-järjestelmäkutsun avulla.
  • Sitten meidän on muodostettava yhteys palvelimen pistorasiaan system()-kutsun avulla.
  • Sitten meidän on lähetettävä ja vastaanotettava tiedot. Voimme tehdä tämän monin eri tavoin. voimme tehdä tämän read()- ja write()-funktion.

Palvelinpuolen socketin perustamiseen liittyvät vaiheet ovat seuraavat:

10 prosenttia 60:stä
  • Se luo ensin socketin socket()-järjestelmäkutsun avulla.
  • Sitten se sitoo socketin osoitteeseen bind()-järjestelmäkutsun avulla. Osoite koostuu isäntäkoneen palvelinpistorasian portin numerosta.
  • Sitten se kuuntelee yhteyttä kuuntelujärjestelmäkutsun () avulla.
  • Sitten palvelin hyväksyy saapuvan yhteyden accept()-järjestelmäkutsun avulla. Se myös estää kaikki saapuvat komennot, kunnes asiakas on yhdistetty palvelimeen.
  • Sitten alkaa tietojen lähetys- ja vastaanottoprosessi.

Useiden asiakkaiden yhdistäminen ilman monisäikeistystä

On olemassa useita esimerkkejä, joissa näemme, kuinka yksittäinen käyttäjä voi muodostaa yhteyden palvelimeen. Nykypäivän ohjelmointimaailmassa palvelimeen on kytketty useita käyttäjiä eri pistokkeilla.

On olemassa useita tapoja saavuttaa tämä. Yksi niistä on monisäikeinen. Monisäikeistyksen avulla voimme saavuttaa tämän. Voimme toteuttaa monisäikeisen prosessin select()-funktion avulla.

Esimerkki:

Koodi asiakkaalle:

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