I tested your code using "
wscat --listen" for the server and it does seem to work right. Maybe your websocket server is expecting different data to be sent first?
I did make a few small changes, but I don't think anything changed that matters:
PHP Code:
#include <socket>
Handle socket;
public OnPluginStart() {
socket = SocketCreate(SOCKET_TCP, OnSocketError);
SocketConnect(socket, OnSocketConnected, OnSocketReceive, OnSocketDisconnected, "127.0.0.1", 8000);
RegServerCmd("sendhello", sendHello);
}
public OnSocketConnected(Handle:s, any:arg) {
PrintToServer("Socket connected!");
sendHandshake();
}
void sendHandshake() {
char str[2048];
Format(str, sizeof(str), "GET / HTTP/1.1\r\nHost: %s\r\nConnection: Upgrade\r\nUpgrade: WebSocket\r\nOrigin: http://127.0.0.1:8000/\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: %s\r\n\r\n", "127.0.0.1:8000", "YW4gc3JjZHMgd3MgdGVzdA==");
PrintToServer("Sending to socket:\n%s", str);
SocketSend(socket, str);
}
public OnSocketError(Handle s, int errorType, int errorNum, any arg) {
PrintToServer("Socket error: %d %d", errorType, errorNum);
}
public OnSocketDisconnected(Handle s, any data) {
PrintToServer("Socket disconnected.");
}
public OnSocketReceive(Handle s, char[] receiveData, int sz, any hFile)
{
PrintToServer("Received from socket:\n%s", receiveData);
if (StrContains(receiveData, "HTTP/1.1 101 Switching Protocols", true) == 0)
{
char acceptKey[29];
Format(acceptKey, 29, "%s", receiveData[StrContains(receiveData, "Sec-WebSocket-Accept: ", true) + 22]);
PrintToServer("ACCEPT-KEY: %s", acceptKey);
}
}
public Action sendHello(int args) {
PrintToServer("Sending websocket frame");
char sTemp[11]; // Text, Masked Hello
sTemp[0] = 0x81;
sTemp[1] = 0x85;
sTemp[2] = 0x37;
sTemp[3] = 0xfa;
sTemp[4] = 0x21;
sTemp[5] = 0x3d;
sTemp[6] = 0x7f;
sTemp[7] = 0x9f;
sTemp[8] = 0x4d;
sTemp[9] = 0x51;
sTemp[10] = 0x58;
SocketSend(socket, sTemp);
}
srcds console:
Code:
Socket connected!
Sending to socket:
GET / HTTP/1.1
Host: 127.0.0.1:8000
Connection: Upgrade
Upgrade: WebSocket
Origin: http://127.0.0.1:8000/
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: YW4gc3JjZHMgd3MgdGVzdA==
Received from socket:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: g0G7yI0fUu+ZAN+kTvfCOjCqOJg=
ACCEPT-KEY: g0G7yI0fUu+ZAN+kTvfCOjCqOJg=
sendhello
Sending websocket frame
Received from socket:
response
wscat:
Code:
$ wscat --listen 8000
listening on port 8000 (press CTRL+C to quit)
client connected
< Hello
> response
>