Socket API или библиотека для С++?
Недавно я стал больше на С++. Я сделал некоторое (очень минимальное) программирование сокетов с помощью C, но был заинтересован в выполнении некоторой работы с С++. Мне удалось найти справочные/обучающие материалы по реализациям сокетов на основе C. Для этого есть причина? Я знаю, или считаю, что знаю, что вы можете использовать библиотеки сокетов C для С++, но не уверен.
Существует ли библиотека сокетов С++, которая используется чаще других? Это не субъективный вопрос, я действительно ищу, чтобы узнать, какие библиотеки/библиотеки Socket для С++.
Я новичок в программировании сокетов и С++, поэтому, пожалуйста, никаких ответов, которые будут бросать меня для цикла.
Спасибо
Ответы
Ответ 1
Здесь я пытаюсь ответить на некоторые из ваших конкретных, фактологических вопросов, на которые мне есть что внести свой вклад.
Да, вы можете использовать любую библиотеку сокетов C в С++. Если он не работает из коробки, потому что компоновщик сообщает ссылку undefined для функций библиотеки, которые вы хотите использовать, затем можете исправить ее, отредактировав <(t → ) файлы библиотеки, добавив extern "C"
перед всеми объявлениями функций и глобальных переменных.
Чтобы найти библиотеки, перейдите в http://freshmeat.net/ и выполните поиск C++ socket
или C socket
. Вот что я нашел для C++ socket
:
Как сказал Рафаэль в своем ответе, вы можете найти полезную часть сокета Qt-библиотеки. См. QTCpSocket для ссылки, а fortune client например код.
Также Boost.Asio появился, но у него может быть слишком много абстракций и низкоуровневых деталей, выставленных для вас.
Выполняйте поиск C socket
на freshmeat, вы можете найти библиотеку C, которая лучше, чем любая библиотека С++.
Ответ 2
Мне удалось найти справочные/обучающие материалы по реализациям сокетов на основе C. Есть ли причина для этого?
Вероятно, потому что все реализации сокетов основаны на исходном слове berkeley c api, который определяет такие функции, как recv, send, listen, accept, select и т.д.
Я очень рекомендую вам взглянуть на Boost ASIO. Это кросс-платформенный С++ API, поэтому любой разрабатываемый вами код будет переносимым. Фактически, ряд других библиотек Boost, которые вы найдете вам полезными, и все они являются кросс-платформой.
В отношении базового API. Вы можете использовать оригинальные функции сокета C как в Windows, так и в Linux. Однако имейте в виду, что под окнами есть некоторые незначительные отличия. например вы должны сначала вызвать функцию WSAstartup.
Хорошей ссылкой на базовое программирование сокетов является руководство Beej для сетевого программирования.
http://beej.us/guide/bgnet/
Я бы порекомендовал немного прочитать его, даже если вы используете С++ api, поскольку он дает вам представление о том, что происходит.
Изменить: Честно говоря, я больше не использую Boost ASIO. Я нашел это ужасно медленным. Используйте LibEV или аналогичные или сворачивайте свои собственные. Boost ASIO не использует epoll для Linux.
Ответ 3
Я разработал библиотеку для сокетов в С++, но только для окон.
Он обеспечивает объектно-ориентированную реализацию с обратными вызовами для приема сообщений!
Вот как я делаю соединение с клиентом:
#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();
}
И это часть сервера:
#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();
}
Как вы можете видеть, он реализует обратные вызовы для приема сообщений и обработки ошибок.
Вот вам gitub для заинтересованных: SocketClient
И это учебник, который я сделал в своем блоге: Причина, по которой вы застряли
Ответ 4
Мне нравится использовать Qt для сокетов. Он обеспечивает объектно-ориентированную реализацию и многоплатформенную