View Single Post
Fyren
FyrenFyrenFyrenFyrenFyren FyrenFyrenFyrenFyrenFyren FyrenFyrenFyrenFyrenFyren FyrenFyrenFyrenFyrenFyren
Join Date: Feb 2106
Old 06-24-2017 , 21:09   Re: Communicating with socket.io using sourcemod and socket
Reply With Quote #8

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_TCPOnSocketError);
        
SocketConnect(socketOnSocketConnectedOnSocketReceiveOnSocketDisconnected"127.0.0.1"8000);
        
RegServerCmd("sendhello"sendHello);
}

public 
OnSocketConnected(Handle:sany:arg) {
        
PrintToServer("Socket connected!");
        
sendHandshake();
}

void sendHandshake() {
        
char str[2048];
        
Format(strsizeof(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(socketstr);
}

public 
OnSocketError(Handle sint errorTypeint errorNumany arg) {
        
PrintToServer("Socket error: %d %d"errorTypeerrorNum);
}

public 
OnSocketDisconnected(Handle sany data) {
        
PrintToServer("Socket disconnected.");
}

public 
OnSocketReceive(Handle schar[] receiveDataint szany hFile)
{
        
PrintToServer("Received from socket:\n%s"receiveData);
        if (
StrContains(receiveData"HTTP/1.1 101 Switching Protocols"true) == 0)
        {
                
char acceptKey[29];
                
Format(acceptKey29"%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(socketsTemp);

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
>
Fyren is offline