Implementación de servidor TCP y cliente bajo Linux tutorial

  
 

programa mirada servidor TCP:
# include < stdlib.h > # include < stdio.h > # include < errno.h > # include < string.h > # include < NetDB .h > # include < sys /types.h > # include < netinet /in.h > # include < sys /socket.h > #define númeropuerto puerto número de puerto //servidor y el cliente 3333 número debe ser igual
int main (int argc, char * argv []) {int sockfd, new_fd; struct sockaddr_in SERVER_ADDR; struct sockaddr_in client_addr; int sin_size; int nbytes; char buffer [1024]; /​​* iniciar la construcción de servidor descriptor sockfd * /if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == - 1) //AF_INET: IPV4; SOCK_STREAM: TCP {fprintf (stderr, " error del zócalo:% s \\ n \\ a " , strerror (errno)); de salida (1);} /* llenar sockaddr servidor de estructura * /bzero (&SERVER_ADDR, sizeof (sockaddr_in struct)); //inicializar contador 0server_addr.sin_family = AF_INET; //Internetserver_addr. Sin_addr.s_addr = htonl (INADDR_ANY); //(convierte los datos largos en esta máquina en datos largos en la red) y cualquier otro Comunicación de la máquina //INADDR_ANY significa que puede recibir datos de cualquier dirección IP, es decir, vincular a todos los IPserver_addr.sin_port = htons (número de puerto); //(transformar los datos cortos en esta máquina en datos cortos en la red) número de puerto /* incluido descriptor sockfd a la dirección IP * /if (bind (sockfd, (struct sockaddr *) (&SERVER_ADDR), sizeof (sockaddr struct)) == - 1) {fprintf (stderr, " Enlazar error:% s \\ n \\ a ", strerror (errno)); exit (1);} /* Establezca el número máximo de clientes que se pueden conectar * /if (listen (sockfd, 5) == - 1) {fprintf (stderr, " Listen Error:% s \\ n \\ a ", strerror (errno)); exit (1);} while (1) {/* El servidor bloquea hasta que el cliente establece una conexión * /sin_size = sizeof (struct sockaddr_in); if (( new_fd = aceptar (sockfd, (struct sockaddr *) (&client_addr), &sin_size)) == - 1) {fprintf (stderr, " aceptar error:% s \\ n \\ a ", strerror (errno)); de salida (1);} fprintf (stderr, " servidor de obtener la conexión de% s \\ n ", inet_ntoa (client_addr.sin_addr)); //convertir una dirección de red a una cadena if ((nbytes = read (new_fd ,. Buffer, 1024)) == - 1) //aquí se puede escribir como si ((nbytes = recv (new_fd, buffer, 1024,0)) == - 1) {fprintf (stderr, " Error de lectura:% s \\ n ", strerror (errno)); exit (1);} buffer [nbytes] = '\\ 0'; printf (" Servidor recibido% s \\ n ", búfer); /* Esta comunicación ha finalizado * /close (new_fd); /* Loop next * /} /* La comunicación final * /cierre (sockfd); exit (0);} programa cliente vea:
# include < stdlib.h > # include < stdio.h > # include < errno.h > # include < string.h > # include < netdb.h > # include < sys /types.h > # include < netinet /in.h > # include < sys /socket.h > #define númeropuerto 3333int main (int argc, char * argv []) {int sockfd; char buffer [1024]; struct sockaddr_in SERVER_ADDR; struct hostent * anfitrión; /* consulta de nombres usando el nombre de host * /if (! argc = 2) {fprintf (stderr, " Uso:% s hostname \\ a \\ n ", argv [0]); la salida (1);} if ((host = gethostbyname (argv [1])) == NULL) {fprintf ( Stderr, " Gethostname error \\ n "); exit (1);} /* El programa cliente comienza a construir el descriptor sockfd * /if ((soc kfd = socket (AF_INET, SOCK_STREAM, 0)) == - 1) //AF_INET: Internet; SOCK_STREAM: TCP {fprintf (stderr, " Socket Error:% s \\ a \\ n ", strerror (errno)); salida (1);} /* llenar los datos cliente-servidor * /bzero (&SERVER_ADDR, sizeof (SERVER_ADDR)); //inicializar contador 0server_addr.sin_family = AF_INET; //IPV4server_addr.sin_port = htons (número de puerto); //(convierte los datos cortos en esta máquina a los datos cortos en la red) número de puerto server_addr.sin_addr = * ((struct in_addr *) host-> h_addr); //dirección IP /* el cliente inicia la solicitud de conexión * /si (connect (sockfd, (struct sockaddr *) (&SERVER_ADDR), sizeof (struct sockaddr)) == - 1) {fprintf (stderr, " conectar error:% s \\ a \\ n ", strerror (Error) ); exit (1);} /* La conexión se realizó correctamente * /printf (" Ingrese el carácter: \\ n "); /* Enviar datos * /fgets (buffer, 1024, stdin); write (sockfd, buffer, strlen (buffer)); //aquí puede escribirse como send (sockfd, buffer, strlen (buffer), 0); /* end communication * /close (sockfd); exit (0);} resultados de ejecución del programa De la siguiente manera: (Nota: servidor cliente de socket y socket del servidor parece estar en un cliente de máquina virtual diferente en tcp_server HI3515 compilador gcc -o tcp_server.c usando el brazo-hismall-linux-gcc -o tcp_client.c tcp_hiclient para compilar Programa) Server Side:
Cliente:

Copyright © Conocimiento de Windows All Rights Reserved