Problem mit verbindung zu einem CS:S Server



  • Moin,

    ich wollte über einen UDP-Socket die Info's über meinen CS:S Server empfangen,
    was soweit auch ganz gut funktioniert, nur irgendwie bekomm ich nur die halbe Nachricht.

    Hier mal mein Code :

    #include "stdafx.h"
    #include <iostream>
    #include <winsock2.h>
    #pragma comment(lib,"ws2_32.lib")
    
    #define DEFAULT_BUFLEN 1000
    #define DEFAULT_PORT "27015"
    #define A2S_INFO "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        WSADATA wsaData;
        int iResult;
    
        SOCKET ConnectSocket;
        struct sockaddr_in clientService; 
        char recvbuf[DEFAULT_BUFLEN];
        int recvbuflen = DEFAULT_BUFLEN;
    
        iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (iResult != NO_ERROR) {
          printf("WSAStartup failed: %d\n", iResult);
          return 1;
        }
    
        ConnectSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (ConnectSocket == INVALID_SOCKET) {
            printf("Error at socket(): %ld\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }
    
        clientService.sin_family = AF_INET;
        clientService.sin_addr.s_addr = inet_addr( "82.149.234.75" );
        clientService.sin_port = htons( 27015 );
    
        iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) );
        if ( iResult == SOCKET_ERROR) {
            closesocket (ConnectSocket);
            printf("Unable to connect to server: %ld\n", WSAGetLastError());
            WSACleanup();
            return 1;
        }
    
        iResult = send( ConnectSocket, A2S_INFO, (int)strlen(A2S_INFO), 0 );
        if (iResult == SOCKET_ERROR) {
            printf("send failed: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
        }
    
        printf("Bytes Sent: %ld\n", iResult);
    
        do {
            iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if ( iResult > 0 )
                printf("Bytes received: %d\n", iResult);
            else if ( iResult == 0 )
                printf("Connection closed\n");
            else
                printf("recv failed: %d\n", WSAGetLastError());
    
        } while( iResult = 0 );
    
    	std::cout<<recvbuf;
    
        iResult = shutdown(ConnectSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
            printf("shutdown failed: %d\n", WSAGetLastError());
            closesocket(ConnectSocket);
            WSACleanup();
            return 1;
    	}
    
        closesocket(ConnectSocket);
        WSACleanup();
    
    	system("PAUSE");
    	return 0;
    }
    

    Und hier noch das Developer Wiki von Valve : http://developer.valvesoftware.com/wiki/Server_Queries

    Und hier die Nachricht die empfange :

    ÿÿÿÿISERVERNAME
    

    und hier das was ich empfangen _sollte_ :

    ÿÿÿÿI.game2xs.com Counter-StrikeSource #1.de_dust.cstrike.Counter-Strike: Source......dl..1.0.0.22.
    

    Also wie kann ich die ganze Nachricht empfangen?

    Ty 🙂



  • Soweit ich mich entsinne enthält die Rückgabe vom Server doch 0-Bytes.. cout hört bei diesen auf auszugeben. Also hast du vermutlich bereits deine gesamte Rückgabe.



  • Danke für die antwort

    wie kann ich denn z.b. dies in einer datei speichern?

    std::ofstream MyFile;
    MyFile.open("C:\\test.txt")
    MyFile << recvbuf;
    MyFile.close();
    

    Da wird dann ja auch nur bis zum Servernamen gespeichert.



  • ostream& write ( const char* s , streamsize n );
    


  • Danke geht jetzt 😉



  • Hi megagamer,

    ich habe gelesen, dass wenn du bei einer UDP-Verbindung die funktion connect() verwendest auch send() und recv() nutzen kannst anstatt sendto() und recvfrom()(was bei dir der fall ist) und da werden die fehlenden Informationen zur Adresse automatisch ergänzt d.h. bei dir gibt es keine weiteren Informationen.

    Mit freundlichen Grüßen

    Erdem Yüksel


Anmelden zum Antworten