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.
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.
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
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.
Szakaszok az ügyfél számára
- 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 = 'Hello from client'; 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)>