Hva er socket-programmering?
Socket-programmering er en måte å koble to noder på et nettverk for å kommunisere med hverandre. En socket (node) lytter på en bestemt port på en IP, mens den andre socket når ut til den andre for å danne en forbindelse. Serveren danner lytterkontakten mens klienten når ut til serveren.
Statusdiagram for server- og klientmodell

Tilstandsdiagram for server- og klientmodell av Socket
Stadier for server
Serveren opprettes ved å bruke følgende trinn:
if uttalelse java
1. Socketoppretting
int sockfd = socket(domain, type, protocol)>
- sockfd: socket-beskrivelse, et heltall (som et filhåndtak) domene: heltall, spesifiserer kommunikasjonsdomene. Vi bruker AF_ LOCAL som definert i POSIX-standarden for kommunikasjon mellom prosesser på samme vert. For kommunikasjon mellom prosesser på forskjellige verter koblet til IPV4 bruker vi AF_INET og AF_I NET 6 for prosesser koblet med IPV6. type: kommunikasjonstype
SOCK_STREAM: TCP (pålitelig, tilkoblingsorientert)
SOCK_DGRAM: UDP(upålitelig, tilkoblingsløs) protokoll: Protokollverdi for Internet Protocol(IP), som er 0. Dette er det samme tallet som vises i protokollfeltet i IP-overskriften til en pakke.(man-protokoller for flere detaljer)
2. Setsockopt
Dette hjelper med å manipulere alternativer for sokkelen referert av filbeskrivelsen sockfd. Dette er helt valgfritt, men det hjelper med gjenbruk av adresse og port. Forhindrer feil som: adresse som allerede er i bruk.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Bind
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Etter opprettelsen av socket, binder bind-funksjonen socket til adressen og portnummeret spesifisert i addr(egendefinert datastruktur). I eksempelkoden binder vi serveren til den lokale verten, derfor bruker vi INADDR_ANY for å spesifisere IP-adressen.
4. Lytt
int listen(int sockfd, int backlog);>
Den setter serverkontakten i en passiv modus, der den venter på at klienten nærmer seg serveren for å opprette en tilkobling. Etterslepet definerer maksimal lengde som køen av ventende tilkoblinger for sockfd kan vokse til. Hvis en tilkoblingsforespørsel kommer når køen er full, kan klienten motta en feil med en indikasjon på ECONNREFUSED.
5. Godta
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Den trekker ut den første tilkoblingsforespørselen i køen av ventende tilkoblinger for lyttekontakten, sockfd, oppretter en ny tilkoblet kontakt, og returnerer en ny filbeskrivelse som refererer til den kontakten. På dette tidspunktet etableres forbindelsen mellom klient og server, og de er klare til å overføre data.
Stadier for klient
1. Stikkontakt: Nøyaktig det samme som serverens socketoppretting
2. Koble til: Connect()-systemanropet kobler kontakten referert til av filbeskrivelsen sockfd til adressen spesifisert av addr. Serverens adresse og port er spesifisert i adr.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Gjennomføring
Her utveksler vi en hei-melding mellom server og klient for å demonstrere klient/server-modellen.
C Program for å lage server
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;> }> |
>
konvertering av int til streng i java
>
C Program for å opprette klient
klient.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;> }> |
>
>
Produksjon
java design mønstre
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Kompilere
gcc client.c -o client gcc server.c -o server>
Neste: Socket-programmering i C/C++: Håndtering av flere klienter på server uten multithreading