Проблемы с сервером Websocket в C

1

Мне нужно использовать NGINX в качестве прокси-сервера WebSocket, и я смог запустить этот учебник без каких-либо проблем. В этом случае простое приложение WebSocket выполняется с использованием ws и Node.js. Однако мне нужно подставить код в javascript (server.js) с помощью приложения, разработанного на C.

Для этого я попытался использовать последний пример, показанный в этом уроке, который очень прост и понятен.

Однако, используя тот же порт и конфигурацию, что и в server.js, при запуске скомпилированного кода C кажется, что связь не установлена должным образом. В этом случае, когда я запускаю wscat в клиентском терминале, кажется, что он чего-то ждет, потому что слово "подключено" никогда не увидено, но связь еще не закончена (вот почему я говорю, что кажется, что он чего-то ждет, в других случаях, если я пытаюсь использовать другой порт, например, связь закрывается и появляется предложение как "ошибка: неожиданный ответ сервера").

С другой стороны, на стороне сервера я вижу, что есть новое соединение. Я подозреваю, что ответ с сервера не поступает на клиента, но я не знаю почему. Nginx правильно настроен, так как пример, выполняемый в javascript, работает правильно, и я использую те же порты как в javascript, так и в C (в server.js у меня есть: wss = new WebSocketServer ({port: 8010}); server.c: 'server.sin_port = htons (8010);' с моей точки зрения он должен работать...)

Я пробовал с другими примерами в C с аналогичным поведением. Кто-нибудь знает, что может быть причиной этого? Вы рекомендуете другие специальные коды C для серверов WebSocket?

  • 1
    В этом случае, что является мотивацией использования чистого C? Node.js может использовать FFI для загрузки в библиотеки C, если вам нужно использовать C для части кода.
  • 0
    @tadman это то, что он хочет использовать. Зачем ставить под сомнение это?
Показать ещё 5 комментариев
Теги:
nginx
server
websocket

2 ответа

3
Лучший ответ

Ваша проблема в том, что существует очень заметное различие между websockets и сокетами. Сокеты - это сетевые интерфейсы более низкого уровня, тогда как веб-серверы работают на каком-то веб-сервере.

Я бы рекомендовал использовать библиотеку websocket для C. :) Вот что я нашел после быстрого поиска в Google. Документацию для указанной библиотеки можно найти здесь.

  • 0
    Спасибо всем за разъяснения и решение.
2

Ответ, данный @MustacheMoses, очень близок (я поддерживаю) - там огромная разница между сокетами и веб-сокетами.

Websockets - это протокол, начинающийся с запроса HTTP "обновления" и продолжающийся с помощью протокола мультиплексирования обмена сообщениями с использованием конкретной схемы упаковки данных.

Сокеты относятся к каналам связи нижнего уровня (т.е. Потоковым сокетам, таким как сокеты TCP/IP или Unix Sockets или даже Raw Sockets).

Я также хотел бы отметить, что, подобно node.js, библиотеки и серверы websocket в C поступают в разные вкусы.

Некоторые библиотеки обеспечивают почти веб-рамочный подход (например, kore.io или мою собственную инфраструктуру facil.io), а другие более узкие.

Подобно узлам/серверам node.js (которые часто пишутся на C или C++), все они отличаются производительностью и функциями (я бы проверил это, прежде чем я перейду к конкретному подходу).

Как справедливо указал @tadman, лучше было бы придерживаться существующей базы кода и добавлять любые библиотеки C, которые вам нужны, используя FFI.

Это несколько редко для высокоуровневых сервисов, таких как веб-приложения, для создания с использованием языка более низкого уровня.

Обратное также верно, часто менее желательно создавать веб-сервер нижнего уровня с использованием языка более высокого уровня.

Это только мое скромное мнение, но считаю, что я пишу это, даже если я являюсь автором рамок приложений websocket, написанных на C. Когда придет время написать фактическое приложение Websocket для производства, я часто предпочитаю использовать facil. io как расширение Ruby C и написать приложение в Ruby (если Ruby недоступен).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню