logo

Socket programavimas C/C++

Šiuolaikiniame pasaulyje kompiuterių tinklai atlieka svarbų vaidmenį duomenų perdavimo srityje. Tai dalykas, kurį turėtų žinoti kiekvienas programuotojas. Kompiuterių tinkle lizdų programavimas yra viena iš svarbiausių temų programavimo pasaulyje. Šioje temoje aptariame lizdų programavimą ir skirtingą lizdų programavimo metodą, kuris yra įdiegtas C++.

C++ kalboje lizdų programavimas yra metodas, kuris tinkle sujungia du ar daugiau mazgų, kad mazgai galėtų dalytis duomenimis neprarasdami duomenų. Šiuo atžvilgiu vienas mazgas klauso vieno prievado, prijungto prie tam tikro IP adreso. Kai klientas pasiekia serverį, serveris sukuria lizdo klausytoją.

specialiųjų simbolių pavadinimas

Kas yra lizdas?

Supraskime apie lizdą pateikdami realiojo laiko pavyzdį. Lizdas yra laikmena, kuri užtikrina ryšį tarp dviejų įrenginių. Lizdas gali būti telefono įkroviklis, kuris užtikrina ryšį tarp lizdo ir telefono arba telefono ir to nešiojamojo kompiuterio. Lizdo pagalba prie vietinio tinklo su skirtingais prievadais prijungiamos įvairios programos. Kiekvieną kartą, kai sukuriamas lizdas, serveris nurodo programą, o ta programa nurodo lizdą ir domeno adresą.

Lizdas yra mechanizmo tipas, naudojamas keistis duomenimis tarp skirtingų procesų. Čia šie procesai vyksta skirtinguose įrenginiuose arba tame pačiame įrenginyje, kuris yra prijungtas per tinklą. Sukūrus lizdo ryšį, duomenys gali būti siunčiami abiem kryptimis ir tęsiami tol, kol vienas iš galinių taškų nutraukia ryšį.

Socket programavimas C/C++

Kliento ir serverio komunikacijos procedūra

Yra keletas procedūrų, kurių turime laikytis norėdami užmegzti kliento ir serverio ryšį. Tai yra taip.

    Lizdas:Lizdo pagalba galime sukurti naują komunikaciją.Įpareigoti:Su jo pagalba galime prijungti vietinį adresą su lizdu.Klausyk:Su šia pagalba; galime priimti ryšį.Priimti:Su šia pagalba; galime blokuoti gaunamą ryšį, kol gausite užklausą.Prisijungti:Su šia pagalba; galime pabandyti užmegzti ryšį.Siųsti:Su to pagalba; mes galime siųsti duomenis per tinklą.Gauti:Su šia pagalba; mes galime gauti duomenis per tinklą.Uždaryti:Tai padedame atjungti ryšį iš tinklo.

Serverio lizdo kūrimo etapai

Yra keletas etapų, kuriais galime sukurti serverio lizdą. Tai yra taip.

    int socketcr:Socket (domenas, tipas, protokolas)Socketcr:Tai sveikųjų skaičių tipas ir panašus į failų tvarkyklę.Domenas:Tai yra bendravimo domenas ir yra sveikojo skaičiaus tipas.Tipas:Tai bendravimo tipas.SOCK_DGRAM:Tai UDP tipas, kuris yra nepatikimas ir be ryšio.Protokolas:Jis naudojamas IP adreso protokolo reikšmei priskirti, kuri yra 0. Protokolo reikšmė yra panaši į reikšmę, rodomą kišenės IP antraštės protokolo lauke.

Kas yra Ryšys?

Ryšys yra ryšys tarp dviejų mašinų, kai abi programinės įrangos yra žinomos viena apie kitą. Šios dvi programinės įrangos žino, kaip užmegzti ryšį viena su kita; Kitaip tariant, galime pasakyti, kad šios dvi programinės įrangos žino, kaip siųsti bitus tinkle. Lizdo prijungimas reiškia, kad abu įrenginiai turėtų žinoti visą tarpusavyje susijusią informaciją, pvz., telefono numerį, IP adresą ir TCP prievadą.

Lizdas yra objekto tipas, panašus į failą, leidžiantį programai priimti įeinantį ryšį ir leisti siųsti arba priimti įeinantį ryšį. Be to, tai yra serverio procesui priskirtas išteklių tipas.

Serveris gali sukurti lizdą naudodamas socket(). Šio lizdo negalima bendrinti su jokiu kitu procesoriumi.

    Setsockopt:Naudodami Setsockopt galime manipuliuoti įvairiomis lizdo parinktimis, kurias nurodo lizdo failo aprašas. Šis procesas yra visiškai neprivalomas. Setsockopt pagalba galime pakartotinai panaudoti kliento ir serverio prievadą ir adresą. Kai serveris pateikia klaidą „adresas jau naudojamas“, galime to išvengti naudodami „Setsockopt“.Įpareigoti:Surišimo funkcijos pagalba galime susieti lizdą su adresu ir prievadą. Ši operacija atliekama sukūrus lizdą. Pavyzdžiui, jei bandome susieti serverį su vietiniu pagrindiniu kompiuteriu, serverio IP adresui apibrėžti naudojame INADDR_ANY.Klausyk:Prisijungimo režimo lizdą galime padaryti klausymosi () funkcijos pagalba. Ryšio režimo lizdo pavyzdys yra SOCK_STREAM. Tai galima apibrėžti lizdo argumentu. Tai naudojama priimant įeinantį ryšį, atlikti įeinančio ryšio eilės operaciją ir atlikti gaunamo ryšio atsilikimą. Kai gaunamas ryšys prašo serverio patvirtinimo, lizdas perjungiamas į pasyvųjį režimą. Serverio atsilikimo parametras nurodo tai, kad jis vienu metu negali leisti daugiau nei vieno ryšio prie serverio. Jei atsiranda tam tikras įeinantis ryšys, o eilė pilna, tada serveris pateikia klaidą su nuoroda „ECONNREFUSED“. Klausimo() pagalba įeinantis ryšys sulaikomas, o kai eilė tuščia, iškviečia visus įeinančius ryšius į serverį.Priimti:Padedant priimti() sistemos skambutį; galime pagaminti jungtimi pagrįstą lizdą. Kai kurie ryšiu pagrįsti lizdai yra SOCK_STREAMan ir SOCK_SEQPACKET. Jis ištraukia visus gaunamus ryšius, kurie ateina pirmiausia, ir leidžia jų užklausai patekti į serverį. Naujai prijungtas sąrašas negali klausytis naudojant kitą argumentą dėl naujo lizdo sukūrimo.

Kliento etapai

    Kištukinio lizdo jungtis:Tai lygiai taip pat, kaip ir serverio sukūrimo metodas.Prisijungti:Mes galime inicijuoti ryšį su lizdu naudodamiesi connect() sistemos iškvietimu. Jei lizdo parametras yra SOCK_DGRAM tipas, tada datagramą galime apibrėžti kaip nuolatinę, naudodami connect(). Jei lizdas yra SOCK_STREAM tipo, galime bandyti užmegzti kitą ryšį su serveriu. Funkcija connect() taip pat galime sukurti ryšį su užsienio asociacija. Jei lizdas nesusietas, sistema vietinei asociacijai priskiria unikalią reikšmę. Kai sistema sėkmingai skambina, lizdas yra paruoštas siųsti arba priimti bet kokio tipo duomenis.Siųsti / gauti:Funkcijos send() ir recv() gali atlikti toliau nurodytą operaciją.
  • Lizdas, kuriame duomenys gali būti perduodami tarpusavyje.
  • Saugojimo buferis gali saugoti duomenis apie adresą, pvz., addr_of_data ir addr_of_buffer.
  • Tai susiję su buferio dydžiu, pvz., len_of_data ir len_of_buffer.
  • Tai susiję su vėliava, nurodančia, kaip bus siunčiami duomenys.

Veiksmai, kaip užmegzti ryšį su lizdu

Jis nustato ryšį tarp skirtingų klientų ir serverio. Tačiau ir klientas, ir serveris gali valdyti lizdo ryšį. Kiekvienas procesas turi sukurti ryšį su savo lizdu.

sąrašą rūšiuoti java

Veiksmai, susiję su lizdo sukūrimu kliento pusėje, yra šie:

  • Jis sukuria lizdą su socket() sistemos iškvietimu.
  • Tada mes turime prisijungti prie serverio lizdo adreso sistemos () skambučio pagalba.
  • Tada mes turime siųsti ir gauti duomenis. Tai galime padaryti įvairiais būdais. galime atlikti šią skaitymo () ir rašymo () funkciją.

Veiksmai, susiję su lizdo sukūrimu serverio pusėje, yra tokie:

  • Pirmiausia jis sukuria lizdą su socket() sistemos iškvietimu.
  • Tada jis susieja lizdą su adresu, naudodamas bind() sistemos iškvietimą. Adresą sudaro pagrindinio kompiuterio serverio lizdo prievado numeris.
  • Tada jis klausosi ryšio, naudodamas klausymosi () sistemos skambutį.
  • Tada serveris priima įeinantį ryšį, naudodamas accept() sistemos iškvietimą. Jis taip pat blokuoja visas gaunamas komandas, kol klientas neprisijungia prie serverio.
  • Tada prasideda duomenų siuntimo ir gavimo procesas.

Kelių klientų prijungimas be kelių gijų

Yra įvairių pavyzdžių, kuriuose matome, kaip vienas vartotojas gali prisijungti prie serverio. Šiuolaikiniame programavimo pasaulyje keli vartotojai yra prijungti prie serverio skirtingais lizdais.

Yra įvairių būdų tai pasiekti. Vienas iš jų yra daugiasriegis. Naudodamiesi daugiasriegiu siūlu, galime tai pasiekti. Mes galime įgyvendinti kelių gijų procesą, naudodami funkciją select().

Pavyzdys:

Kodas klientui:

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