C/Visual C - Turbo C y acceso a Red

 
Vista:

Turbo C y acceso a Red

Publicado por Karmen (1 intervención) el 03/03/2003 17:49:59
Me gustaria saber si es posible programar en C, no en C++, codigo que permita accedera la red local o al resto. Y si es posible, como????
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Acceso a redes locales y comunicación con sockets en C

Publicado por Alejandro (1016 intervenciones) el 06/05/2025 23:20:16
Sí, es posible programar en C para acceder a la red local y a otras redes, incluyendo Internet. Para ello, puedes utilizar las bibliotecas de sockets que están disponibles en C. Los sockets son una forma de comunicación entre procesos que permite la transmisión de datos a través de una red.

A continuación, te muestro un ejemplo básico de cómo crear un cliente y un servidor en C utilizando sockets. Este ejemplo te permitirá entender cómo establecer una conexión en la red local.

Ejemplo de código en C



Servidor (server.c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
 
#define PORT 8080
#define BUFFER_SIZE 1024
 
int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[BUFFER_SIZE] = {0};
 
    // Crear el socket
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("Error al crear el socket");
        exit(EXIT_FAILURE);
    }
 
    // Opciones del socket
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
        perror("Error al establecer opciones del socket");
        exit(EXIT_FAILURE);
    }
 
    // Configurar la dirección del servidor
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY; // Aceptar conexiones de cualquier dirección
    address.sin_port = htons(PORT);
 
    // Enlazar el socket
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("Error al enlazar el socket");
        exit(EXIT_FAILURE);
    }
 
    // Escuchar conexiones
    if (listen(server_fd, 3) < 0) {
        perror("Error al escuchar");
        exit(EXIT_FAILURE);
    }
 
    printf("Esperando conexiones en el puerto %d...\n", PORT);
 
    // Aceptar una conexión
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("Error al aceptar la conexión");
        exit(EXIT_FAILURE);
    }
 
    // Leer datos del cliente
    read(new_socket, buffer, BUFFER_SIZE);
    printf("Mensaje recibido: %s\n", buffer);
 
    // Enviar respuesta al cliente
    const char *response = "Hola desde el servidor";
    send(new_socket, response, strlen(response), 0);
    printf("Respuesta enviada\n");
 
    // Cerrar el socket
    close(new_socket);
    close(server_fd);
    return 0;
}

Cliente (client.c)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
 
#define PORT 8080
#define BUFFER_SIZE 1024
 
int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hola desde el cliente";
    char buffer[BUFFER_SIZE] = {0};
 
    // Crear el socket
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Error al crear el socket \n");
        return -1;
    }
 
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
 
    // Convertir IPv4 y IPv6 direcciones desde texto a binario
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        printf("\n Dirección no válida/ Dirección no soportada \n");
        return -1;
    }
 
    // Conectar al servidor
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\n Error de conexión \n");
        return -1;
    }
 
    // Enviar mensaje al servidor
    send(sock, hello, strlen(hello), 0);
    printf("Mensaje enviado\n");
 
    // Leer respuesta del servidor
    read(sock, buffer, BUFFER_SIZE);
    printf("Respuesta del servidor: %s\n", buffer);
 
    // Cerrar el socket
    close(sock);
    return 0;
}

Compilación y ejecución



1. Compila el servidor y el cliente:
1
2
gcc server.c -o server
gcc client.c -o client

2. Ejecuta el servidor:
1
./server

3. En otra terminal, ejecuta el cliente:
1
./client

Explicación del código



- Servidor:
- Crea un socket y lo enlaza a una dirección IP y un puerto.
- Escucha conexiones entrantes.
- Acepta una conexión y lee un mensaje del cliente.
- Envía una respuesta al cliente.

- Cliente:
- Crea un socket y se conecta al servidor utilizando la dirección IP y el puerto.
- Envía un mensaje al servidor y espera una respuesta.

Consideraciones



- Red local: Asegúrate de que el servidor y el cliente estén en la misma red local o que el servidor sea accesible desde la red del cliente.
- Dirección IP: En el cliente, puedes cambiar `"127.0.0.1"` por la dirección IP del servidor si están en diferentes máquinas.
- Firewall: Asegúrate de que no haya un firewall bloqueando el puerto que estás utilizando.

Este es un ejemplo básico para comenzar a trabajar con redes en C. Puedes expandirlo para incluir más funcionalidades, como manejar múltiples clientes, enviar diferentes tipos de datos, etc. ¡Buena suerte, Karmen!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar