Подтвердить что ты не робот

Socket API или библиотека для С++?

Недавно я стал больше на С++. Я сделал некоторое (очень минимальное) программирование сокетов с помощью C, но был заинтересован в выполнении некоторой работы с С++. Мне удалось найти справочные/обучающие материалы по реализациям сокетов на основе C. Для этого есть причина? Я знаю, или считаю, что знаю, что вы можете использовать библиотеки сокетов C для С++, но не уверен.

Существует ли библиотека сокетов С++, которая используется чаще других? Это не субъективный вопрос, я действительно ищу, чтобы узнать, какие библиотеки/библиотеки Socket для С++.

Я новичок в программировании сокетов и С++, поэтому, пожалуйста, никаких ответов, которые будут бросать меня для цикла.

Спасибо

4b9b3361

Ответ 1

Здесь я пытаюсь ответить на некоторые из ваших конкретных, фактологических вопросов, на которые мне есть что внести свой вклад.

Да, вы можете использовать любую библиотеку сокетов C в С++. Если он не работает из коробки, потому что компоновщик сообщает ссылку undefined для функций библиотеки, которые вы хотите использовать, затем можете исправить ее, отредактировав <(t → ) файлы библиотеки, добавив extern "C" перед всеми объявлениями функций и глобальных переменных.

Чтобы найти библиотеки, перейдите в http://freshmeat.net/ и выполните поиск C++ socket или C socket. Вот что я нашел для C++ socket:

  • Socket ++.
  • ENUt.
  • LibSylph.
  • CPPSocket также может работать для вас, хотя последнее обновление было в 2003 году.
  • SocketW аналогично старый: последнее обновление в 2003 году.

Как сказал Рафаэль в своем ответе, вы можете найти полезную часть сокета 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 для сокетов. Он обеспечивает объектно-ориентированную реализацию и многоплатформенную