windows - Websocket server i C + + programmeringsfejl

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at oprette et websocket server program. Her er håndskakningskoden. Men når jeg forsøger at oprette forbindelse med krom, slettes forbindelsen. Tjek dette ud og se, om du kan finde en fejl.


iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
    if (iResult > 0) 
    {

        char *s = strstr(recvbuf,"Sec-WebSocket-Key:");
        s = s + strlen("Sec-WebSocket-Key:");

        char  buff[200] = {};
        int i = 0;
        while((int)*s != 13)
        {
            if((int)*s != 32)
            {
                buff[i] = *s;
                i++;
            }
            s++;
        }
        buff[i] = '';
        strcat(buff,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
        hashwrapper *myWrapper = new sha1wrapper();
        std::string hash(myWrapper->getHashFromString(buff));

        std::string encoded = base64\_encode(reinterpret\_cast<const unsigned char*>(hash.c\_str()), hash.length());

        char * handshakeFormat = "HTTP/1.1 101 Web Socket Protocol Handshake
"
    "Upgrade: WebSocket
"
    "Connection: Upgrade
"
    "Sec-WebSocket-Accept: \%s

";

        memset(recvbuf,0,sizeof(recvbuf));
        sprintf(recvbuf,handshakeFormat,encoded.c\_str());
                iSendResult = send( ClientSocket, recvbuf, iResult, 0 );


        delete myWrapper;
        myWrapper = NULL;
    }


Til test formål:


nøgle='dGhlIHNhbXBsZSBub25jZQ =='


unik nøgle='258EAFA5-E914-47DA-95CA-C5AB0DC85B11'


sha1 hash: 'b37a4f2cc0624f1690f64606cf385945b2bec4ea'


Dette er produceret af min sha1 hashing funktion.


faktisk sha1 hash ifølge RFC6455: '0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6
   0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea '[4]


base64 kodet='YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ =='


Dette er produceret af min base64 encoder


faktisk base64-kodning som pr. RFC6455: 's3pPLMBiTxaQ9kYGzzhZRbK + xOo =' [5]


Google Chrome sender håndtryksdataene i formatet:


GET /?encoding=text HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:2000
Origin: http://www.websocket.org
Sec-WebSocket-Key: SEvjVT+KuQHF0TRSdop3GA==
Sec-WebSocket-Version: 13

Bedste reference


Du skal kode for bytesværdier for hash. Lige nu konverterer du hasen til en hexadecimal streng, før du kodes for den.


Afkod 's3pPLMBiTxaQ9kYGzzhZRbK + xOo =' og konverter output til en hex streng, og du vil se det 's B3 7A 4F 2C C0 62 4F 16 90 F6 46 06 CF 38 59 45 B2 BE C4 EA


'YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ ==' på den anden side, når dekodet resulterer i (strengen) 'b37a4f2cc0624f1690f64606cf385945b2bec4ea' .