2009-03-19 29 views
34

Necesito implementar rápidamente una pequeña solución de cliente/servidor C o C++ TCP. Esto es simplemente para transferir literalmente una matriz de bytes de una computadora a otra, no necesita ser escalable/demasiado complicado. Cuanto más simple, mejor. Rápido y sucio si puedes.¿Qué es un ejemplo sencillo de cliente y servidor C o C++ TCP?

He intentado utilizar el código de este tutorial, pero no pude conseguir que se construye usando g ++ en Linux: http://www.linuxhowtos.org/C_C++/socket.htm

Si es posible, me gustaría evitar las bibliotecas 3 ª parte, como el sistema de I Estoy ejecutando esto en es bastante restringido. Esto debe ser C o C++ ya que la aplicación existente ya está implementada.

Gracias a EMG-2 's respuesta, me las arreglé para hacer que el mencionado ejemplo de código compatible con C++ utilizando los siguientes pasos:

añadir estas cabeceras para el cliente y el servidor:

#include <cstdlib> 
#include <cstring> 
#include <unistd.h> 

En server.c, cambie el tipo de clilen a socklen_t.

int sockfd, newsockfd, portno/*, clilen*/; 
socklen_t clilen; 

En client.c, cambie la línea siguiente:

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) { ... } 

Para: impulso

if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 

Respuesta

39

He usado Beej's Guide to Network Programming en el pasado. Está en C, no en C++, pero los ejemplos son buenos. Vaya directamente al section 6 para ver los programas simples de ejemplo de cliente y servidor.

+0

Gracias - Encontré una muestra (http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver) pero no estoy seguro si es excesivo, ¿realmente necesito todo ese código? –

+0

@ nickbolton2705: Probablemente, sí. El código de Beej tiene incluido el manejo de errores, que es parte del motivo por el que me gusta tanto. También tenga en cuenta que el servidor admite múltiples conexiones simultáneas, e IPv4 e IPv6. –

+0

Sí, esto sería genial para una solución elegante: noté que una de las funciones es la serialización, que podría ser útil para mí si tuviera que implementar esto correctamente en algún momento. –

7

intento :: lib asio (http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html) que tiene ejemplos de lote.

+1

¿Estas muestras son apropiadas? http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/iostreams/daytime_server.cpp http://www.boost.org/doc/libs/1_36_0/doc /html/boost_asio/example/iostreams/daytime_client.cpp –

12

Si el código debe ser simple, entonces probablemente pida el ejemplo C basado en los zócalos BSD tradicionales. Las soluciones como boost::asio son bastante complicadas en lo que respecta al ejemplo corto y simple de "hello world".

Para compilar los ejemplos que mencionó, debe realizar correcciones simples, porque está compilando bajo el compilador de C++. Me refiero a los archivos siguientes:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
de: http://www.linuxhowtos.org/C_C++/socket.htm

  1. Agregar siguiente incluye tanto a los archivos:

    #include <cstdlib> 
    #include <cstring> 
    #include <unistd.h> 
    
  2. En client.c, cambie la línea:

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

    a:

    if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) 
    { ... } 
    

Como se puede ver en C++ se necesita una conversión explícita.

+1

También, en server.c I tuvo que cambiar el tipo de clilen a socklen_t, y emitir la salida de sizeof (cli_addr); –

+0

bonita respuesta concisa. – bdd

Cuestiones relacionadas