servidor - ¿Socket API o biblioteca para C++?
socket listen c++ (4)
Me gusta usar Qt para programar tomas. Proporciona una implementación orientada a objetos y es multiplataforma
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.
¿Hay una biblioteca de socket C ++ que se usa 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
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 el lenguaje C original berkeley socket api que define funciones como recv, send, listen, accept, select etc.
Te recomiendo encarecidamente que mires el Boost ASIO. Es una API C ++ multiplataforma, por lo que cualquier código que desarrolles 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. por ejemplo, primero debe llamar a la función WSAstartup.
Una buena referencia para la programación básica de zócalos es la guía de Beej para la programación de redes .
Recomiendo leer un poco, incluso si está utilizando una API de C ++, ya que le da una idea de lo que está sucediendo.
Editar: para ser sincero, ya no uso Boost ASIO. Lo encontré terriblemente lento. Use LibEV o similar o haga su propia versión. Boost ASIO no parece usar epoll en Linux.
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!
Así es como hago 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 puede ver, implementa devoluciones de llamadas para recibir mensajes y manejar errores.
Aquí está el github para el interesado: SocketClient
Y este es un tutorial que hice en mi blog: Porque estás atascado
Aquí estoy tratando de responder algunas de sus preguntas específicas y objetivas a las que tengo algo que contribuir.
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 los archivos .h
de la biblioteca, agregando extern "C"
delante de todas las funciones y declaraciones de variables globales.
Para encontrar bibliotecas, vaya a http://freshmeat.net/ y busque el C++ socket
o el C socket
Esto es lo que he encontrado para el C++ socket
:
- Socket ++ .
- ENUt .
- LibSylph .
- CPPSocket también podría funcionar para usted, aunque la última actualización fue en 2003.
- SocketW es similarmente viejo: última actualización en 2003.
Como Raphael ha mencionado en su respuesta, es posible que encuentre útil el zócalo como parte de la biblioteca de Qt. Vea QTCpSocket para referencia y el cliente de fortuna, por ejemplo, código.
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 ++.