Установите рукопожатие между Winsock ws клиентом и сервером Websocket - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь провести рукопожатие между моим 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 Ответ

0 голосов
/ 06 января 2019

recv() возвращает 0, когда удаленный узел изящно закрывает соединение на своем конце.

Вы пытаетесь запросить ресурс WSS (безопасный WebSocket) с порта HTTPS (безопасный HTTP). Таким образом, вам нужно сначала завершить рукопожатие SSL / TLS с сервером, прежде чем вы сможете отправить рукопожатие WebSocket. Вы не выполняете часть SSL / TLS, поэтому сервер немедленно отключает вас.

Winsock не имеет понятия SSL / TLS. Вам нужно использовать Microsoft SChannel API или стороннюю библиотеку, такую ​​как OpenSSL, поверх вашего сокетного соединения.

Вам лучше использовать стороннюю библиотеку WebSocket, которая обрабатывает эти детали для вас.

...