logo

Socket programozás C/C++ nyelven

A mai világban a számítógépes hálózatok fontos szerepet töltenek be az adatátvitel területén. Ez egy olyan téma, amelyet minden programozónak tudnia kell. A számítógépes hálózat alatt a socket programozás az egyik legfontosabb téma a programozási világban. Ebben a témában a socket programozást és a C++ nyelven megvalósított socket programozás különböző módszereit tárgyaljuk.

A C++ nyelvben a socket programozás egy olyan módszer, amely két vagy több csomópontot kombinál egymással egy hálózaton keresztül, így a csomópontok adatvesztés nélkül megoszthatják az adatokat. Ezzel kapcsolatban az egyik csomópont egy adott IP-címhez kapcsolódó portot figyel. Amikor az ügyfél eléri a szervert, a szerver létrehozza a socket figyelőt.

Mi az a Socket?

Ismerjük meg a socketet a valós idejű példával. Az aljzat egyfajta adathordozó, amely kapcsolatot biztosít két eszköz között. Az aljzat lehet telefontöltő, amely kapcsolatot biztosít az aljzat és a telefon, vagy a telefon és a laptop között. Egy socket segítségével különböző alkalmazások csatlakoznak a helyi hálózathoz különböző portokkal. Minden alkalommal, amikor a socket létrejön, a kiszolgáló megadja a programot, az a program pedig a socketet és a tartomány címét.

A socket egy olyan mechanizmus, amelyet a különböző folyamatok közötti adatcserére használnak. Itt ezek a folyamatok vagy különböző eszközökben vannak jelen, vagy ugyanabban az eszközben, amelyek hálózaton keresztül csatlakoznak. Ha létrejött a kapcsolat a socket számára, akkor az adatok mindkét irányba elküldhetők, és addig folytatódik, amíg az egyik végpont be nem zárja a kapcsolatot.

Socket programozás C/C++ nyelven

Eljárás az ügyfél-szerver kommunikációban

Vannak olyan eljárások, amelyeket követnünk kell az ügyfél-szerver kommunikáció kialakításához. Ezek a következők.

    Foglalat:Egy aljzat segítségével új kommunikációt hozhatunk létre.Kötés:Ennek segítségével az aljzattal tudjuk csatolni a helyi címet.Hallgat:Ezzel a segítséggel; elfogadhatjuk a kapcsolatot.Elfogad:Ezzel a segítséggel; blokkolhatjuk a bejövő kapcsolatot, amíg a kérés meg nem érkezik.Csatlakozás:Ezzel a segítséggel; megkísérelhetjük a kapcsolat létrehozását.Küld:Ennek segítségével; hálózaton keresztül tudjuk küldeni az adatokat.Kap:Ezzel a segítséggel; hálózaton keresztül tudjuk fogadni az adatokat.Bezárás:Ennek segítségével felszabadíthatjuk a kapcsolatot a hálózatról.

A szerver socket létrehozásának szakaszai

Vannak olyan lépések, amelyek során létrehozhatjuk a szerver socketjét. Ezek a következők.

csomagküldő bejárás
    int socketcr:Socket (domain, típus, protokoll)Socketcr:Ez egy egész típusú, és olyan, mint egy fájlkezelő.Tartomány:Ez egy kommunikációs tartomány, és egész típusú.Típus:Ez egy kommunikációs típus.SOCK_DGRAM:Ez egyfajta UDP, amely megbízhatatlan és kapcsolat nélküli.Jegyzőkönyv:Az IP-cím protokollértékének hozzárendelésére szolgál, ami 0. A protokoll értéke hasonló a zseb IP fejlécének protokoll mezőjében megjelenő értékhez.

Mi az a kapcsolat?

A kapcsolat egyfajta kapcsolat két gép között, ahol a két szoftver ismert egymásról. Ez a két szoftver tudja, hogyan lehet kapcsolatot létesíteni egymással; más szóval azt mondhatjuk, hogy ez a két szoftver tudja, hogyan küldje el a biteket a hálózaton keresztül. A socket csatlakoztatása azt jelenti, hogy a két gépnek ismernie kell az egymás közötti összes információt, például a telefonszámot, az IP-címet és a TCP-portot.

A socket egy olyan típusú objektum, amely hasonló ahhoz a fájlhoz, amely lehetővé teszi a program számára, hogy elfogadja a bejövő kapcsolatot, és lehetővé tegye számukra a bejövő kapcsolat küldését vagy fogadását. Ezenkívül ez egyfajta erőforrás, amely a kiszolgáló folyamatához van hozzárendelve.

A szerver a socket() segítségével tudja létrehozni a socketet. Ez a foglalat nem osztható meg más processzorral.

    Setsockopt:A Setsockopt segítségével manipulálhatjuk a socket különféle opcióit, amelyekre a socket fájlleírója hivatkozik. Ez a folyamat teljesen opcionális. A Setsockopt segítségével újra felhasználhatjuk a kliens és a szerver portját és címét. Ha a szerver a 'cím már használatban' hibát ad, azt a Setsockopt segítségével megakadályozhatjuk.Kötés:A socketet a címmel és a porttal a bind függvény segítségével köthetjük össze. Ez a művelet a foglalat létrehozása után történik. Például, ha megpróbáljuk a szervert a helyi gazdagéphez kötni, akkor az INADDR_ANY segítségével határozzuk meg a szerver IP-címét.Hallgat:Csatlakozási módú aljzatot készíthetünk a listening to () funkció segítségével. A csatlakozási mód socketje például a SOCK_STREAM. Ezt a socket argumentum határozza meg. Ez a bejövő kapcsolat elfogadására szolgál, a bejövő kapcsolat sorműveletének végrehajtására, valamint a bejövő kapcsolat hátralékának végrehajtására. Amikor egy bejövő kapcsolat nyugtázást kér a szervertől, a socket passzív módba kerül. A szerver hátralék paramétere arra utal, hogy nem engedélyezhet egyszerre több kapcsolatot a szerverrel. Ha valamilyen bejövő kapcsolat jött, és a sor megtelt, akkor a szerver a hibát az „ECONNREFUSED” jelzéssel jelzi. A listen() segítségével a bejövő kapcsolat tartásban van, és amikor a sor üres, az összes bejövő kapcsolatot meghívja a szerverre.Elfogad:Az accept() rendszerhívás segítségével; elkészíthetjük a kapcsolat alapú aljzatot. Egyes kapcsolatalapú socketek SOCK_STREAMand SOCK_SEQPACKET. Kibontja az összes bejövő kapcsolatot, amely először érkezik, és lehetővé teszi, hogy kérésük a szerverhez kerüljön. Az újonnan csatlakoztatott lista nem tud hallgatni egy másik érv segítségével az új socket létrehozására.

Szakaszok az ügyfél számára

    Aljzat csatlakozás:Ez pontosan megegyezik a szerver létrehozásának módszerével.Csatlakozás:Csatlakozást kezdeményezhetünk a sockethez a connect() rendszerhívás segítségével. Ha a socket paramétere egy SOCK_DGRAM típusú, akkor a connect() segítségével a datagramot állandónak definiálhatjuk. Ha a socket SOCK_STREAM típusú, akkor megpróbálhatunk másik kapcsolatot létrehozni a szerverrel. A connect() függvény segítségével kapcsolatot hozhatunk létre a külföldi társulás számára is. Ha a socket kötetlen, akkor a rendszer az egyedi értéket rendeli a helyi társításhoz. Amikor a rendszer sikeresen hívja, a socket készen áll bármilyen típusú adat küldésére vagy fogadására.Küldés fogadás:A send() és recv() függvények az alábbi műveletet hajthatják végre.
  • Az a foglalat, amelyen az adatok kommunikálhatók egymással.
  • A tárolópuffer adatokat tárolhat a címről, például addr_of_data és addr_of_buffer.
  • A puffer méretével foglalkozik, például len_of_data és len_of_buffer.
  • A zászlóval foglalkozik, amely megmondja, hogyan kell elküldeni az adatokat.

Lépések a kapcsolat létrehozásához az aljzatban

Kapcsolatot hoz létre a különböző kliensek és a szerver között. De a kliens és a szerver is képes kezelni a socket kapcsolatot. Minden folyamatnak kapcsolatot kell létesítenie a saját aljzatához.

A socket ügyféloldali létrehozásának lépései a következők:

  • Socket() rendszerhívás segítségével hoz létre egy socketet.
  • Ezután a szerver socket címéhez kell kapcsolódnunk egy system() hívás segítségével.
  • Ezután el kell küldenünk és fogadnunk kell az adatokat. Ezt többféleképpen tehetjük meg. megtehetjük ezt a read() és write() függvényt.

A szerveroldali socket létrehozásának lépései a következők:

  • Először egy socket() rendszerhívás segítségével hoz létre egy socketet.
  • Ezután a socketet a bind() rendszerhívás segítségével egy címhez köti. A cím a gazdagépen lévő szerver socket portszámából áll.
  • Ezután a figyelő () rendszerhívás segítségével figyeli a kapcsolatot.
  • Ezután a szerver fogadja a bejövő kapcsolatot az accept() rendszerhívás segítségével. Ezenkívül blokkol minden bejövő parancsot, amíg egy kliens nem csatlakozik a szerverhez.
  • Ezután megkezdődik az adatok küldésének és fogadásának folyamata.

Több ügyfél összekapcsolása többszálú feldolgozás nélkül

Számos példa van arra, hogy egyetlen felhasználó hogyan tud csatlakozni a szerverhez. A mai programozási világban több felhasználó csatlakozik a szerverhez különböző aljzatokkal.

Ennek elérésére többféle módszer létezik. Az egyik a többszálú. A multithreading segítségével ezt elérhetjük. Többszálú folyamatot valósíthatunk meg a select() függvény segítségével.

Példa:

Kód az ügyfél számára:

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