2011-11-19 20 views
5

Empecé a leer y aprender sobre "sockets", pero estoy buscando un pequeño código-muestra escrito en C para un cliente y servidor que no bloquearáSockets de cliente y servidor no bloqueantes en C

El código debería poder enviar datos desde el cliente y el servidor debe poder recibir el resultado en el estado sin bloqueo, ambos deberían estar en estado sin bloqueo.

He leído mucho en Google y libros, YouTube, pero nada me ayudó.

Este es mi servidor:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    int sock; 
    int addr_len, bytes_read; 
    char recv_data[1024]; 
    struct sockaddr_in server_addr , client_addr; 


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(5000); 

    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    bzero(&(server_addr.sin_zero),8); 


    if (bind(sock,(struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
    { 
     perror("Bind"); 
     exit(1); 
    } 

    addr_len = sizeof(struct sockaddr); 

    printf("\nUDPServer Waiting for client on port 5000"); 
    fflush(stdout); 

    while (1) 
    { 

     bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); // <---- Here is the problem 


     recv_data[bytes_read] = '\0'; 

     printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr), 
       ntohs(client_addr.sin_port)); 
     printf("%s", recv_data); 
     fflush(stdout); 

    } 
    return 0; 
} 

Respuesta

9

Creo que estás preguntando cómo realizar E/S en un socket no bloqueante. Beej's guide ha existido por mucho tiempo; cubre todo esto y más, con buenos ejemplos de código.

+1

Hola Bret - Usé la guía de Beej, pero no puedo conseguirla ... ayúdame con un examen en su lugar. – user1022734

+1

La guía de Beej es bastante clara, y tiene ejemplos de programas para lo que intentas lograr. Eche un vistazo al capítulo 7 de la guía. El primer código es el cliente y el segundo es el servidor. – steve

6

La idea con E/S sin bloqueo es poder manejar múltiples sockets sin tener que recurrir a múltiples hilos. La parte central aquí es I/O de-multiplexing, es decir, una llamada a select(2) o poll(2) (o funciones específicas de plataforma como epoll(7) o kqueue(2)).

Aquí hay un breve introduction.

+0

¿Cómo puedo impactar "select()" en mi servidor? – user1022734

+0

Su bucle espera en 'select()', luego verifica que cualquiera de los sockets registrados sea legible (en un bucle interno), luego lee de cada zócalo activo. –

+0

examen del código por favor, mi inglés no es bueno – user1022734

Cuestiones relacionadas