Kaj je programiranje vtičnic?
Programiranje vtičnic je način povezovanja dveh vozlišč v omrežju za medsebojno komunikacijo. Ena vtičnica (vozlišče) posluša določena vrata na IP-ju, medtem ko druga vtičnica doseže drugo in vzpostavi povezavo. Strežnik oblikuje vtičnico poslušalca, medtem ko se odjemalec obrne na strežnik.
Diagram stanja za model strežnika in odjemalca

Diagram stanja za model strežnika in odjemalca vtičnice
Stopnje za strežnik
Strežnik se ustvari po naslednjih korakih:
java niz matrike
1. Izdelava vtičnice
int sockfd = socket(domain, type, protocol)>
- sockfd: deskriptor vtičnice, celo število (kot ročaj datoteke) domena: celo število, določa komunikacijsko domeno. Za komunikacijo med procesi na istem gostitelju uporabljamo AF_ LOCAL, kot je definirano v standardu POSIX. Za komunikacijo med procesi na različnih gostiteljih, povezanih z IPV4, uporabljamo AF_INET in AF_I NET 6 za procese, povezane z IPV6. vrsta: vrsta komunikacije
SOCK_STREAM: TCP (zanesljiv, povezovalno usmerjen)
SOCK_DGRAM: protokol UDP (nezanesljiv, brez povezave): vrednost protokola za internetni protokol (IP), ki je 0. To je ista številka, ki se pojavi v polju protokola v glavi IP paketa. (man protokoli za več podrobnosti)
2. Setsockopt
To pomaga pri manipulaciji z možnostmi za vtičnico, ki jo navaja deskriptor datoteke sockfd. To je povsem neobvezno, vendar pomaga pri ponovni uporabi naslova in vrat. Preprečuje napako, kot je: naslov je že v uporabi.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Zavežite
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Po izdelavi vtičnice funkcija povezovanja veže vtičnico na naslov in številko vrat, določeno v addr(podatkovna struktura po meri). V primeru kode povežemo strežnik z lokalnim gostiteljem, zato uporabimo INADDR_ANY za določitev naslova IP.
4. Poslušaj
int listen(int sockfd, int backlog);>
Strežniško vtičnico postavi v pasivni način, kjer čaka, da se odjemalec približa strežniku, da vzpostavi povezavo. Zaostanek določa največjo dolžino, do katere lahko naraste čakalna vrsta čakajočih povezav za sockfd. Če zahteva za povezavo prispe, ko je čakalna vrsta polna, lahko odjemalec prejme napako z navedbo ECONNREFUSED.
5. Sprejmi
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Izvleče prvo zahtevo za povezavo v čakalni vrsti čakajočih povezav za poslušajočo vtičnico, sockfd, ustvari novo povezano vtičnico in vrne nov deskriptor datoteke, ki se nanaša na to vtičnico. Na tej točki je vzpostavljena povezava med odjemalcem in strežnikom, ki sta pripravljena za prenos podatkov.
Faze za stranko
1. Priključek vtičnice: Popolnoma enako kot pri ustvarjanju vtičnice strežnika
2. Povežite se: Sistemski klic connect() poveže vtičnico, na katero se sklicuje deskriptor datoteke sockfd, z naslovom, ki ga določa addr. Naslov in vrata strežnika so določena v naslovu.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Izvedba
Tukaj si izmenjujemo eno pozdravno sporočilo med strežnikom in odjemalcem, da prikažemo model odjemalec/strežnik.
C Program za ustvarjanje strežnika
Server.c
C
življenjski cikel razvoja programske opreme
// Server side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> server_fd, new_socket;> >ssize_t valread;> >struct> sockaddr_in address;> >int> opt = 1;> >socklen_t addrlen =>sizeof>(address);> >char> buffer[1024] = { 0 };> >char>* hello =>'Hello from server'>;> >// Creating socket file descriptor> >if> ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >perror>(>'socket failed'>);> >exit>(EXIT_FAILURE);> >}> >// Forcefully attaching socket to the port 8080> >if> (setsockopt(server_fd, SOL_SOCKET,> >SO_REUSEADDR | SO_REUSEPORT, &opt,> >sizeof>(opt))) {> >perror>(>'setsockopt'>);> >exit>(EXIT_FAILURE);> >}> >address.sin_family = AF_INET;> >address.sin_addr.s_addr = INADDR_ANY;> >address.sin_port = htons(PORT);> >// Forcefully attaching socket to the port 8080> >if> (bind(server_fd, (>struct> sockaddr*)&address,> >sizeof>(address))> ><0) {> >perror>(>'bind failed'>);> >exit>(EXIT_FAILURE);> >}> >if> (listen(server_fd, 3) <0) {> >perror>(>'listen'>);> >exit>(EXIT_FAILURE);> >}> >if> ((new_socket> >= accept(server_fd, (>struct> sockaddr*)&address,> >&addrlen))> ><0) {> >perror>(>'accept'>);> >exit>(EXIT_FAILURE);> >}> >valread = read(new_socket, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >send(new_socket, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >// closing the connected socket> >close(new_socket);> >// closing the listening socket> >close(server_fd);> >return> 0;> }> |
>
>
Program C za ustvarjanje odjemalca
stranka.c
C
// Client side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> status, valread, client_fd;> >struct> sockaddr_in serv_addr;> >char>* hello =>'Hello from client'>;> >char> buffer[1024] = { 0 };> >if> ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >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/ Address not supported
'>);> >return> -1;> >}> >if> ((status> >= connect(client_fd, (>struct> sockaddr*)&serv_addr,> >sizeof>(serv_addr)))> ><0) {> >printf>(>'
Connection Failed
'>);> >return> -1;> >}> >send(client_fd, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >valread = read(client_fd, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >// closing the connected socket> >close(client_fd);> >return> 0;> }> |
if else if else if java
>
>
Izhod
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Prevajanje
gcc client.c -o client gcc server.c -o server>
Naprej: Programiranje vtičnic v C/C++: Upravljanje z več odjemalci na strežniku brez večnitnosti