mysql protokoll



  • hallo! Das folgende windows-program verbindet sich mit einem mysql-server

    //#include <windows.h>
    #include <winsock2.h>
    #include <iostream>
    using namespace std;
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
    	while(1)
            {
      		long rc;
      		SOCKET s;
      		SOCKADDR_IN addr;
      		char buf[256];
    
      		// Winsock starten
      		rc=startWinsock();
      		if(rc!=0)
      		{
        			printf("Fehler: startWinsock, fehler code: %d\n",rc);
       			return 1;
      		}
      		else
      		{
        			printf("Winsock gestartet!\n");
      		}
    
      		// Socket erstellen
      		s=socket(AF_INET,SOCK_STREAM,0);
      		if(s==INVALID_SOCKET)
      		{
        			printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        			return 1;
      		}
      		else
      		{
        			printf("Socket erstellt!\n");
      		}
    
                    // Verbinden
      		memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      		addr.sin_family=AF_INET;
      		addr.sin_port=htons(3306); // wir verwenden mal port 12345
      		addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
                    rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      		if(rc==SOCKET_ERROR)
      		{
        			printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        			return 1;
                    }
      		else
      		{
        			printf("Verbunden mit 127.0.0.1..\n");
      		}
    
      		// Daten austauschen
      		while(rc!=SOCKET_ERROR)
      		{
        			gets(buf);
        			send(s,buf,strlen(buf),0);
        			rc=recv(s,buf,256,0);
        			if(rc==0)
        			{
         				printf("Server hat die Verbindung getrennt..\n");
          				break;
        			}
        			if(rc==SOCKET_ERROR)
        			{
          				printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          				break;
        			}
        			buf[rc]='\0';
                            for(int i=0;i<strlen(buf);i++)
                            {
                            	cout<<i<<": "<</*static_cast<int>*/(buf[i])<<endl;
                            }
                    }
      		closesocket(s);
      		WSACleanup();
    	}
            return 0;
    }
    
    int startWinsock(void)
    {
      	WSADATA wsa;
      	return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    nun weiss ich gar nicht was der mysql server erwartet, also was muss das program dem server schicken damit man sich einlogen kann?



  • Ähm, normalerweise benutzt man Klientbibliotheken, die die Kommunikation über Klient-Server abwickeln. Die bieten sowas wie mysql_connect an, übertragen die Anmeldedaten und kehren mit dem Erfolg der Anmeldung zurück.
    Wenn Du das selber auf Low-Level implementieren willst, musst Du das mysql-Kommunikationsprotokoll studieren.
    Vllt hier:
    http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol

    Du kannst natürlich auch ganz haxxormäßig die Kommunikation mit wireshark mitschneiden und es selber rausfinden. 🙂



  • 😃 das würde ich so gerne. leider habe ich es mit mysql++ nicht hinbekommen, wahrschninlich liegts am borland c++ builder 6
    das interessante ist ja dass der server manchmal was zurück schickt. die ersten 10-15 mal schickte der server eine '9' und danach immer nur ein 'i' 😃



  • Wenn du den Builder verwendest solltest Du eigentlich wissen wie man eine WIndowslib ins Borlandformat umwandelt.
    Sonst frag hier im Richtigen Forum danach.
    Selbst zu implementieren (Lowlevel Socket)ist für einen Profi schon nicht leicht.



  • Beim Builder könntest Du auch nach einem DBExpress-Treiber für MySQL suchen. Vorteil beim Entwickeln von Forms-Anwendungen: Du hast gleich Datenanbindung der Controls an Deinen DataStes.
    Es geht natürlich auch ADO oder ODBC.



  • ODBC muss doch vorinstalliert sein oder?


Anmelden zum Antworten