Установите рукопожатие между Winsock ws клиентом и сервером Websocket
Я пытаюсь установить связь между моим WinSock-клиентом и эхо-сервером WebSocket (в моем случае wss://echo.websocket.org, https://www.websocket.org/echo.html). Как я понял, подключается нормально, ошибок нет. Также нет ошибок при попытке отправить заголовок рукопожатия, но при получении я получаю 0.
Некоторые фрагменты кода:
string ipAddress = "174.129.224.73";//echo.websocket ip address
int port = 443; // Listening port # on the server
// Initialize WinSock
WSAData data;
WORD ver = MAKEWORD(2, 2);
int wsResult = WSAStartup(ver, &data);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAddress.c_str(), &hint.sin_addr);
// Connect to server
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
string header = "GET wss://echo.websocket.org/ HTTP/1.1\r\n"
"Host: echo.websocket.org\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Key: BJZcwnjVSapHLie3s8n0yA==\r\n"
"Origin: http://localhost\r\n"
"Sec-WebSocket-Protocol: chat, superchat\r\n"
"Sec-WebSocket-Version: 13\r\n\r\n";
int sendResult = send(sock, header.c_str(), header.length() + 1, 0);
// Do-while loop to send and receive data
char buf[4096];
int bytesReceived = recv(sock, buf, 4096, 0);
....
И вот, recv возвращает 0, но, если все будет хорошо, должен вернуть заголовок ответа.
Итак, теперь я застрял, и любое предложение очень помогло бы...
Также я был бы очень благодарен, если бы кто-то порекомендовал любой другой родной / легкий (только заголовок) C++ lib для легкой работы с веб-сокетами
Заранее спасибо!
1 ответ
recv()
возвращает 0, когда удаленный узел изящно закрывает соединение на своем конце.
Вы пытаетесь запросить ресурс WSS (безопасный WebSocket) с порта HTTPS (безопасный HTTP). Таким образом, вам нужно сначала завершить рукопожатие SSL/TLS с сервером, прежде чем вы сможете отправить рукопожатие WebSocket. Вы не выполняете часть SSL/TLS, поэтому сервер немедленно отключает вас.
Winsock не имеет понятия SSL/TLS. Вам нужно использовать Microsoft SChannel API или стороннюю библиотеку, такую как OpenSSL, поверх вашего сокетного соединения.
Вам лучше использовать стороннюю библиотеку WebSocket, которая обрабатывает эти детали для вас.