Hvad er Socket-programmering?
Socket-programmering er en måde at forbinde to noder på et netværk for at kommunikere med hinanden. Den ene socket(node) lytter på en bestemt port på en IP, mens den anden socket når ud til den anden for at danne en forbindelse. Serveren danner lytter-socket, mens klienten når ud til serveren.
Statusdiagram for server- og klientmodel

Statusdiagram for server- og klientmodel af Socket
Stadier til server
Serveren oprettes ved hjælp af følgende trin:
if statement java
1. Socket Oprettelse
int sockfd = socket(domain, type, protocol)>
- sockfd: socket descriptor, et heltal (som et filhåndtag) domæne: heltal, specificerer kommunikationsdomæne. Vi bruger AF_ LOCAL som defineret i POSIX-standarden til kommunikation mellem processer på samme vært. Til kommunikation mellem processer på forskellige værter forbundet med IPV4, bruger vi AF_INET og AF_I NET 6 til processer forbundet med IPV6. type: kommunikationstype
SOCK_STREAM: TCP (pålidelig, forbindelsesorienteret)
SOCK_DGRAM: UDP(upålidelig, forbindelsesløs) protokol: Protokolværdi for Internet Protocol(IP), som er 0. Dette er det samme tal, som vises i protokolfeltet i IP-headeren på en pakke.(man-protokoller for flere detaljer)
2. Setsockopt
Dette hjælper med at manipulere muligheder for socket, der henvises til af filbeskrivelsen sockfd. Dette er helt valgfrit, men det hjælper med genbrug af adresse og port. Forhindrer fejl som: adresse allerede i brug.
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);>
Efter oprettelsen af socket binder bind-funktionen socket til den adresse og portnummer, der er angivet i addr(custom data structure). I eksempelkoden binder vi serveren til den lokale vært, derfor bruger vi INADDR_ANY til at angive IP-adressen.
4. Lyt
int listen(int sockfd, int backlog);>
Den sætter serversocket i en passiv tilstand, hvor den venter på, at klienten nærmer sig serveren for at oprette forbindelse. Efterslæbet definerer den maksimale længde, som køen af afventende forbindelser til sockfd kan vokse til. Hvis en forbindelsesanmodning ankommer, når køen er fuld, kan klienten modtage en fejl med en indikation af ECONNREFUSED.
5. Accepter
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Den udtrækker den første forbindelsesanmodning i køen af afventende forbindelser til lyttesocket, sockfd, opretter en ny tilsluttet socket og returnerer en ny filbeskrivelse, der henviser til den socket. På dette tidspunkt er forbindelsen etableret mellem klient og server, og de er klar til at overføre data.
Stadier til klient
1. Stikforbindelse: Præcis det samme som serverens socket-oprettelse
2. Tilslut: Connect()-systemkaldet forbinder den socket, der henvises til af filbeskrivelsen sockfd, til adressen angivet af addr. Serverens adresse og port er angivet i adr.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Implementering
Her udveksler vi en hej-besked mellem server og klient for at demonstrere klient/server-modellen.
C Program til at oprette 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;> }> |
>
erstatte alt java
>
C Program til at oprette 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;> }> |
>
>
Produktion
linux kommandoer
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Kompilering
gcc client.c -o client gcc server.c -o server>
Næste: Socket-programmering i C/C++: Håndtering af flere klienter på serveren uden multi-threading