• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Komunikacja aplikacji napisanej w C++ a JavaScript

VPS Starter Arubacloud
+1 głos
561 wizyt
pytanie zadane 31 marca 2021 w C i C++ przez rafaeru Początkujący (330 p.)
Witam, utknąłem pisząc pracę inżynierską i mam do was pytanie, może uda wam się mnie jakoś nakierować na najłatwiejsze/najlepsze rozwiązanie.

Piszę interface użytkownika z użyciem HTML5, czyli program w C++ który wyświetla HTML, javascript, CSS oraz sam interface (wygląd). Potrzebuje przesyłać dane z C++ do javascriptu (strony localhost) i w drugą stronę. Dokładnie chodzi o obliczanie wartości temperatury w C++ i pobieranie zadanej temperatury ze strony i wyświetlanie tej obliczonej. Próbowałem poprzez websockety (winsock) bo tak polecił mi promotor ale tylko dla testu, nawiązuje połącznie lecz nie potrafie zrobić "handshake" aby zfinalizować połączenie. Dodatkowo docelowo kod ma działać pod Linuxem więc winsock raczej odpada.

Tworzył ktoś podobną aplikację? Użył może jakiejś bilbioteki? Nie mam na to pomysłu gdyż nie znam się na "sieciowej" stronie programowania.
komentarz 1 kwietnia 2021 przez tkz Nałogowiec (42,000 p.)

3 odpowiedzi

0 głosów
odpowiedź 1 kwietnia 2021 przez Michał Muzyka Pasjonat (24,080 p.)
Odpowiednikiem windowsowego winsock na linuxie jest <sys/socket.h>
jakby Pan pokazał kod tego winsocket może coś by udało się wymyślić, potem przekonwertować na linkusową wersję, api jest dość podobne
komentarz 1 kwietnia 2021 przez rafaeru Początkujący (330 p.)

C++

#include "pch.h"
#include <iostream>
#include <winsock.h>

int main()
{
	WSADATA wsaData;

	int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (result != NO_ERROR)
		printf("Initialization error.\n");

	SOCKET mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (mainSocket == INVALID_SOCKET)
	{
		printf("Error creating socket: %ld\n", WSAGetLastError());
		WSACleanup();
		return 1;
	}

	sockaddr_in service;
	memset(&service, 0, sizeof(service));
	service.sin_family = AF_INET;
	service.sin_addr.s_addr = inet_addr("127.0.0.1");
	service.sin_port = htons(27015);

	if (bind(mainSocket, (SOCKADDR *)& service, sizeof(service)) == SOCKET_ERROR)
	{
		printf("bind() failed.\n");
		closesocket(mainSocket);
		return 1;
	}

	if (listen(mainSocket, 1) == SOCKET_ERROR)
		printf("Error listening on socket.\n");

	SOCKET acceptSocket = SOCKET_ERROR;
	printf("Waiting for a client to connect...\n");

	while (acceptSocket == SOCKET_ERROR)
	{
		acceptSocket = accept(mainSocket, NULL, NULL);
	}

	printf("Client connected.\n");
	mainSocket = acceptSocket;

	int bytesSent;
	int bytesRecv = SOCKET_ERROR;
	char sendbuf[32] = "Server says hello!";
	char recvbuf[1024] = "";

	bytesSent = send(mainSocket, sendbuf, strlen(sendbuf), 0);
	printf("Bytes sent: %ld\n", bytesSent);
	printf("Listening: \n\n");
	while(1) {
		bytesRecv = recv(mainSocket, recvbuf, 1024, 0);
		printf("%s\n", recvbuf);
	}
	system("pause");
}

JavaScript

let ws = new WebSocket('ws://127.0.0.1:27015/'); 
    //logging the websocket property properties
    console.log(ws);
    //sending a message when connection opens
    ws.onopen = (event) => ws.send("This is a message from client");
    //receiving the message from server
    ws.onmessage = (message) => console.log(message);

Konsola (po nawiązaniu połączenia):

GET / HTTP/1.1
Host: 127.0.0.1:27015
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7
Sec-WebSocket-Key: c4Z/hYbWVXm+zNFRD2U7ng==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

I tutaj powinienem zrobić "handshake" z tego co przeczytałem ale nie wiem jak to zaimplementować używając tylko winsock.

komentarz 1 kwietnia 2021 przez Oscar Nałogowiec (29,290 p.)
Serwer otrzymał żadanie HTTP, musisz wysłać odpowiedź HTTP.
komentarz 1 kwietnia 2021 przez rafaeru Początkujący (330 p.)
Więc powinienem raczej to zrobić poza pętlą a później w pętli (przerwaniu?) sobie przesyłać i odbierać dane?
komentarz 2 kwietnia 2021 przez Oscar Nałogowiec (29,290 p.)

Napisałeś taki jednorazowy serwerek, więc trudno powiedzieć co chciałeś dostać.  Na razie odsyłasz stały tekst ("Server says hello!"), który nijak się nie ma do tego o co pyta się klient, a nawet do protokołu HTTP. Tak jak koledzy radzą, najprościej użyć jakiejś biblioteki, która to załatwi, ale chyba (jako praca własna) nie bardzo możesz. Zwykle zaczyna się od przeczytania dokumentacji, w tym przypadku RFC 6455.

0 głosów
odpowiedź 1 kwietnia 2021 przez j23 Mędrzec (194,920 p.)

Jak chcesz bardziej multiplatformowo, możesz użyć np. biblioteki asio lub jakiejś wyższego poziomu implementującej protokół HTTP (bo jeśli dobrze pamiętam, websockety komunikują się za pośrednictwem tego protokołu; może POCO)

0 głosów
odpowiedź 1 kwietnia 2021 przez tangarr Mędrzec (154,780 p.)
Możesz użyć tej biblioteki https://github.com/zaphoyd/websocketpp

Biblioteka jest typu include-only. Nie wymaga żadnego linkowania. W podkatalogu examples znajdziesz dużo przykładów.
komentarz 1 kwietnia 2021 przez rafaeru Początkujący (330 p.)
Widziałem to wcześniej, tylko, że tam są przykłady od strony C++ a mi chodzi jak to powinno wyglądać od strony JavaScript'owej

Podobne pytania

0 głosów
1 odpowiedź 37 wizyt
–1 głos
0 odpowiedzi 134 wizyt
0 głosów
1 odpowiedź 277 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...