Kas ir ligzdu programmēšana?
Socket programmēšana ir veids, kā savienot divus tīkla mezglus, lai sazinātos viens ar otru. Viena ligzda (mezgls) klausās noteiktā IP portā, bet otra ligzda sasniedz otru, lai izveidotu savienojumu. Serveris veido klausītāja ligzdu, kamēr klients sasniedz serveri.
Servera un klienta modeļa stāvokļa diagramma

Socket servera un klienta modeļa stāvokļa diagramma
Posmi serverim
Serveris tiek izveidots, veicot šādas darbības:
galdi no lateksa
1. Socket izveide
int sockfd = socket(domain, type, protocol)>
- sockfd: ligzdas deskriptors, vesels skaitlis (piemēram, faila rokturis) domēns: vesels skaitlis, norāda sakaru domēnu. Mēs izmantojam AF_ LOCAL, kā noteikts POSIX standartā, lai sazinātos starp procesiem tajā pašā resursdatorā. Lai sazinātos starp procesiem dažādos resursdatoros, kas savienoti ar IPV4, mēs izmantojam AF_INET un AF_I NET 6 procesiem, kas savienoti ar IPV6. tips: komunikācijas veids
SOCK_STREAM: TCP (uzticams, uz savienojumu orientēts)
SOCK_DGRAM: UDP (neuzticams, bezsavienojuma) protokols: interneta protokola (IP) protokola vērtība, kas ir 0. Šis ir tas pats skaitlis, kas tiek rādīts protokola laukā paketes IP galvenē (lai iegūtu sīkāku informāciju, man protokoli)
2. Setsockopt
Tas palīdz manipulēt ar faila deskriptora sockfd norādītās ligzdas opcijām. Tas ir pilnīgi neobligāts, taču tas palīdz atkārtoti izmantot adresi un portu. Novērš tādas kļūdas kā: adrese jau tiek izmantota.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Sasiet
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Pēc ligzdas izveides saistīšanas funkcija saista ligzdu ar adresi un porta numuru, kas norādīts addr (pielāgota datu struktūra). Piemēra kodā mēs saistām serveri ar vietējo resursdatoru, tāpēc mēs izmantojam INADDR_ANY, lai norādītu IP adresi.
4. Klausieties
int listen(int sockfd, int backlog);>
Tas ievieto servera ligzdu pasīvā režīmā, kur tas gaida, līdz klients tuvojas serverim, lai izveidotu savienojumu. Neatpaliktais uzkrājums nosaka maksimālo garumu, līdz kuram var pieaugt sockfd neapstiprināto savienojumu rinda. Ja savienojuma pieprasījums tiek saņemts, kad rinda ir pilna, klients var saņemt kļūdas ziņojumu ar norādi ECONNREFUSED.
5. Pieņemt
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Tas izvelk pirmo savienojuma pieprasījumu gaidošo savienojumu rindā klausīšanās ligzdai sockfd, izveido jaunu savienotu ligzdu un atgriež jaunu faila deskriptoru, kas attiecas uz šo ligzdu. Šajā brīdī tiek izveidots savienojums starp klientu un serveri, un tie ir gatavi datu pārsūtīšanai.
Posmi klientam
1. Kontaktligzdas savienojums: Tieši tāds pats kā servera ligzdas izveides gadījumā
2. Savienot: Sistēmas izsaukums connect() savieno ligzdu, uz kuru norāda faila deskriptors sockfd, ar adresi, kas norādīta adr. Servera adrese un ports ir norādīts adr.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Īstenošana
Šeit mēs apmaināmies ar vienu sveicienu starp serveri un klientu, lai parādītu klienta/servera modeli.
C Programma servera izveidei
Server.c
C
// 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;> }> |
>
>
C Programma klienta izveidei
klients.c
java vietējais datums
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;> }> |
>
>
Izvade
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Sastādīšana
java pārtraukumam
gcc client.c -o client gcc server.c -o server>
Nākamais: Socket programmēšana C/C++: vairāku klientu apstrāde serverī bez vairāku pavedienu izveidošanas