2010-11-16 9 views
14

Recientemente he estado obteniendo más en C++. He hecho algo de programación de socket (muy mínima) con C, pero he estado interesado en hacer algún trabajo con C++. Solo he podido encontrar referencias/tutoriales sobre implementaciones de socket basadas en C. ¿Hay alguna razón para esto? Lo sé, o creo que sé que puedes usar las bibliotecas de C socket para C++, pero no estoy seguro.¿API de socket o biblioteca para C++?

¿Hay una biblioteca de socket C++ que se utilice con más frecuencia que otras? Esta no es una pregunta subjetiva, en realidad estoy buscando averiguar qué son las API/bibliotecas de Socket para C++.

Soy bastante nuevo en la programación de socket y C++, así que por favor no hay respuestas que me pongan a prueba.

Gracias

+2

Una prueba importante de cualquier librería de sockets es si se expone eventos. Qt sí, la API nativa Win32 socket (ver 'WSAAsyncSelect'), las tomas BSD hacen posibles los eventos sin hacerlos fáciles (' select' y 'poll', que al contrario del nombre es controlado por eventos, no sondea, o' XtAppAddInput '). Muchas otras bibliotecas te obligan a un estilo de bloqueo de un hilo por conexión que no solo es ineficiente, sino que conduce a errores. La complicación aquí es que sus eventos de socket y UI o puerto serie o cualquier otro evento que su programa trate tienen que ser compatibles en un solo ciclo de eventos. –

Respuesta

8

Aquí estoy tratando de responder a algunas de sus preguntas específicas y concretas a las que tengo algo que aportar.

Sí, puede usar cualquier biblioteca de socket C en C++. Si no funciona de fábrica porque el vinculador informa una referencia indefinida para las funciones de la biblioteca que desea utilizar, puede solucionarlo editando el archivo .h de la biblioteca, agregando extern "C" en frente a todas las funciones y declaraciones de variables globales. Para encontrar bibliotecas, vaya a http://freshmeat.net/, y busque C++ socket o C socket. Esto es lo que he encontrado para C++ socket:

  • Socket++.
  • ENUt.
  • LibSylph.
  • CPPSocket también podría funcionar para usted, aunque la última actualización se realizó en 2003.
  • SocketW es igualmente antigua: última actualización en 2003.

Como Raphael ha mencionado en su respuesta, es posible encontrar el zócalo parte de la biblioteca de Qt útil. Consulte QTCpSocket para referencia, y el fortune client para el código de ejemplo.

También me vino a la mente Boost.Asio, pero podría tener demasiada abstracción y detalles de bajo nivel expuestos para usted.

Haga su búsqueda de C socket en carne fresca, puede encontrar una biblioteca C que se adapte mejor que cualquier biblioteca C++.

+2

libsylph no parece tratar con sockets o redes en absoluto. socketw es un envoltorio muy delgado. socket ++ hace que usar sockets sea realmente fácil, y parece que no proporciona ninguna forma de usar bien los sockets (sin bloqueo). –

+0

lol, recuerda la carne fresca? – cat

3

Me gusta usar Qt para programar tomas. Proporciona una implementación orientada a objetos y es multiplataforma

+0

Pero es un horror usarlo con diferentes hilos. (tienes que trabajar con señales entre) – leon22

4

Solo he podido encontrar referencias/tutoriales sobre implementaciones de socket basadas en C. ¿Hay alguna razón para esto?

Probablemente porque todas las implementaciones de socket se basan en la API del conector de lenguaje C Berkeley original que define funciones como recv, envían, escuchar, aceptar, seleccione etc.

puedo recomendar encarecidamente nos fijamos en la Boost ASIO. Es una API C++ multiplataforma, por lo que cualquier código que desarrolle será portátil. De hecho, hay otras bibliotecas de Boost que le resultarán útiles y todas ellas son multiplataforma.

Con referencia a la API básica. Puede usar las funciones originales del socket C tanto en Windows como en Linux. Sin embargo, tenga en cuenta que bajo Windows hay algunas diferencias leves. p.ej. primero debe llamar a la función WSAstartup.

Una muy buena referencia para la programación básica de socket es Beej's guide to network programming.

http://beej.us/guide/bgnet/

lo recomiendo tener un poco de lectura sobre ella, incluso si usted está utilizando una API C++, ya que le da una comprensión de lo que está pasando.


Edit: Para ser sincero, ya no utilizo Boost ASIO. Lo encontré terriblemente lento. Use LibEV o similar o haga su propia versión. Boost ASIO no parece usar epoll en Linux.

4

Desarrollé una biblioteca para sockets en C++, pero solo para Windows. ¡Proporciona una implementación orientada a objetos con devoluciones de llamadas para recibir mensajes!

Éste es cómo hacer una conexión desde el cliente:

#include <iostream> 
#include <winsock2.h> 
#include "SocketClient.h" 

using namespace std; 

void onError(errorStruct *e) 
{ 
    cout << e->code << " : " << e->message << endl; 
} 

int main() 
{ 
    SocketClient client("127.0.0.1", 5555); 
    client.setErrorCallback(onError); 
    client.connect(); 
    client.send("Hello World!"); 
    client.close(); 
} 

Y esta es la parte del servidor:

#include <iostream> 
#include <winsock2.h> 
#include "SocketClient.h" 
#include "SocketServer.h" 

using namespace std; 

bool good=true; 

void messageReceived(messageStruct *s) 
{ 
    cout << "client: " << s->message << endl; 
} 

void errorOccurred(errorStruct *e) 
{ 
    cout << e->code << " : " << e->message << endl; 
    good=false; 
} 

int main() 
{ 
    SocketServer server(5555); 
    SocketClient client(server.accept()); 
    client.setErrorCallback(errorOccurred); 
    client.setMessageCallback(messageReceived); 

    while(good){}; 

    client.close(); 
    server.close(); 
} 

Como se puede ver que implementa las devoluciones de llamada para recibir mensajes y tratamiento de errores.

Aquí es el github para el interesado: SocketClient

Y este es un tutorial que hice en mi blog: Cause You're Stuck