Advertisement
nerdemma

sockets

Mar 13th, 2025 (edited)
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.56 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h> // Para close()
  9.  
  10. int main() {
  11.     int sockfd;
  12.     struct sockaddr_in address;
  13.     int result;
  14.     char ch[1024];
  15.     char c[1024];
  16.     char ipserver[16]; // Tamaño suficiente para direcciones IPv4
  17.     int puerto;
  18.     int ciclo = 1;
  19.  
  20.     printf("Ingrese la IP del servidor: ");
  21.     if (scanf("%15s", ipserver) != 1) {
  22.         fprintf(stderr, "Error al leer la IP del servidor.\n");
  23.         return 1;
  24.     }
  25.  
  26.     printf("Ingrese el puerto de la conexión: ");
  27.     if (scanf("%d", &puerto) != 1) {
  28.         fprintf(stderr, "Error al leer el puerto.\n");
  29.         return 1;
  30.     }
  31.  
  32.     while (ciclo) {
  33.         sockfd = socket(AF_INET, SOCK_STREAM, 0);
  34.         if (sockfd == -1) {
  35.             perror("Error al crear el socket");
  36.             return 1;
  37.         }
  38.  
  39.         address.sin_family = AF_INET;
  40.         address.sin_addr.s_addr = inet_addr(ipserver);
  41.         address.sin_port = htons(puerto); // Usar htons para la conversión de puerto
  42.  
  43.         result = connect(sockfd, (struct sockaddr *)&address, sizeof(address));
  44.         if (result == -1) {
  45.             perror("Error en la conexión");
  46.             close(sockfd);
  47.             return 1;
  48.         }
  49.  
  50.         printf("Conexión establecida.\n");
  51.  
  52.         // Recibir el primer mensaje del servidor
  53.         memset(ch, 0, sizeof(ch)); // Limpiar el búfer
  54.         if (recv(sockfd, ch, sizeof(ch) - 1, 0) > 0) {
  55.             printf("%s\n", ch);
  56.         } else {
  57.             perror("Error al recibir el mensaje inicial del servidor");
  58.             close(sockfd);
  59.             return 1;
  60.         }
  61.  
  62.         printf("Ingrese una cadena para enviar al servidor: ");
  63.         memset(c, 0, sizeof(c)); // Limpiar el búfer
  64.         scanf(" %1023[^\n]", c); // Leer hasta el salto de línea, con límite
  65.  
  66.         if (send(sockfd, c, strlen(c), 0) == -1) {
  67.             perror("Error al enviar datos al servidor");
  68.             close(sockfd);
  69.             return 1;
  70.         }
  71.  
  72.         memset(ch, 0, sizeof(ch)); // Limpiar el búfer
  73.         if (recv(sockfd, ch, sizeof(ch) - 1, 0) > 0) {
  74.             printf("El servidor dijo: %s\n", ch);
  75.         } else {
  76.             perror("Error al recibir datos del servidor");
  77.             close(sockfd);
  78.             return 1;
  79.         }
  80.         close(sockfd);
  81.     }
  82.  
  83.     return 0;
  84. }
  85.  
  86. }
  87. /*servidor*/
  88. #include <stdio.h>
  89. #include <stdlib.h> // Para exit()
  90. #include <string.h>
  91. #include <sys/socket.h>
  92. #include <sys/types.h>
  93. #include <netinet/in.h>
  94. #include <arpa/inet.h>
  95. #include <unistd.h> // Para close()
  96.  
  97. #define BUFFER_SIZE 1024
  98.  
  99. int main() {
  100.     int server_sockfd, client_sockfd;
  101.     struct sockaddr_in server_address, client_address;
  102.     socklen_t server_len, client_len;
  103.     char client_message[BUFFER_SIZE], server_message[BUFFER_SIZE];
  104.     int port;
  105.  
  106.     printf("Dirección del servidor: 127.0.0.1\n\n");
  107.     printf("Ingrese el puerto de escucha:\n\n");
  108.     if (scanf("%d", &port) != 1) {
  109.         fprintf(stderr, "Error: Puerto inválido.\n");
  110.         return 1;
  111.     }
  112.  
  113.     server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
  114.     if (server_sockfd < 0) {
  115.         perror("Error al crear el socket");
  116.         return 1;
  117.     }
  118.  
  119.     server_address.sin_family = AF_INET;
  120.     server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
  121.     server_address.sin_port = htons(port); // Convertir a orden de bytes de red
  122.     server_len = sizeof(server_address);
  123.  
  124.     if (bind(server_sockfd, (struct sockaddr *)&server_address, server_len) < 0) {
  125.         perror("Error al enlazar el socket");
  126.         close(server_sockfd);
  127.         return 1;
  128.     }
  129.  
  130.     if (listen(server_sockfd, 5) < 0) {
  131.         perror("Error al escuchar en el socket");
  132.         close(server_sockfd);
  133.         return 1;
  134.     }
  135.  
  136.     printf("Servidor en espera...\n");
  137.  
  138.     while (1) {
  139.         client_len = sizeof(client_address);
  140.         client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
  141.         if (client_sockfd < 0) {
  142.             perror("Error al aceptar la conexión");
  143.             continue; // Continuar con el siguiente cliente
  144.         }
  145.  
  146.         printf("-------Sesión iniciada-------\n");
  147.         printf("Cliente conectado\n");
  148.  
  149.         memset(server_message, 0, sizeof(server_message)); // Limpiar el buffer
  150.         strcpy(server_message, "Servidor Conectado\n");
  151.         if (send(client_sockfd, server_message, strlen(server_message), 0) < 0) {
  152.             perror("Error al enviar el mensaje de conexión");
  153.             close(client_sockfd);
  154.             continue;
  155.         }
  156.  
  157.         memset(client_message, 0, sizeof(client_message)); // Limpiar el buffer
  158.         if (recv(client_sockfd, client_message, BUFFER_SIZE - 1, 0) < 0) {
  159.             perror("Error al recibir el mensaje del cliente");
  160.             close(client_sockfd);
  161.             continue;
  162.         }
  163.         printf("El cliente dijo: %s\n", client_message);
  164.  
  165.         printf("Ingrese una cadena:\n");
  166.         memset(server_message, 0, sizeof(server_message));
  167.         if (fgets(server_message, BUFFER_SIZE, stdin) == NULL) {
  168.             perror("Error al leer la entrada del usuario");
  169.             close(client_sockfd);
  170.             continue;
  171.         }
  172.         server_message[strcspn(server_message, "\n")] = 0; //remove newline from fgets.
  173.  
  174.         close(client_sockfd); // Cerrar el socket del cliente
  175.     }
  176.  
  177.     close(server_sockfd); // Cerrar el socket del servidor (nunca se alcanza en este bucle infinito)
  178.     return 0;
  179. }
  180.  
Tags: sockets
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement