HILFE BEI CLIENT-SERVER-KOMMUNIKATION: SPEICHERZUGRIFSSFEHLER



  • Hi Leute, ich hoffe ihr hattet alle ein schönes Fest ! :xmas1: :xmas2:
    Ich habe einen separaten Client und einen separaten Server, die miteinander
    byteweise Informationen austauschen sollen.
    PROBLEM: Auf SOLARIS-Unix funktioniert die Kommunikation ohne Probleme, nur auf meinem SUSE-Linux wird beim Start des Clients diese Meldung ausgegeben:
    "Speicherzugriffsfehler.....".
    Ich benötige dringend Hilfe zu meinem unten stehenden Client-Code.
    Der Fehler dürfte so zwischen Zeile 37 und Zeile 40 liegen:

    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>
    #include <strings.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netinet/tcp.h>
    #include <netdb.h>
    #include <sys/signal.h>
    #include <iostream>
    #include <errno.h>
    
    #define MAXPUF 1
    
    using namespace std;
    
    //CLIENT:
    int main()
    {
    int Client_Socket;
    struct sockaddr_in AdrSock;
    int MsgLen = sizeof(AdrSock); /* Die Laenge der Socketstruktur */
    
    struct hostent *RechnerID;
    //struct servent *Service;
    
      Client_Socket = socket(AF_INET, SOCK_STREAM, 0);
      if (Client_Socket == -1) {
      	perror("socket-error");
    	return 1;
      }
      int neu_adresse = 1;
      int wert=setsockopt(Client_Socket, SOL_SOCKET, SO_REUSEADDR,&neu_adresse,sizeof(neu_adresse));//bewirkt, dass nach Beendigung einer Verbindung der Port fuer eine andere Verbindung verwendet werden kann!
    
      /* Bestimme den Zielrechner */
      RechnerID = gethostbyname("saturn");
    //   printf("address: %i\n", RechnerID->h_addr);
      bzero(&AdrSock, sizeof(AdrSock));
      bcopy(RechnerID->h_addr, &AdrSock.sin_addr, RechnerID->h_length);
    
      /* Bestimme den Port */
      // Service = getservbyname("hilfe","tcp");
      AdrSock.sin_family = AF_INET;
      AdrSock.sin_port = 12401;
    
      if (connect(Client_Socket, (struct sockaddr *)&AdrSock, sizeof(AdrSock)) == -1) // ?????????????? SIEHE CAST-KORREKTHEIT
      {
      	perror("connect-error");
    	return 1;
      }
    
      cout << "Gebe Text ein: " << endl;
      string str;
      getline(cin, str);
      size_t i = 0;
      while(i<str.length()){
      	//char byte;
      	//cin >> byte;
      	char Puffer[MAXPUF];
      	Puffer[0] = str[i];
      	int anzahl_ein=write(Client_Socket,Puffer,MAXPUF); // strlen+1 wie sizeof
      	cerr << anzahl_ein << "\n";
    	i++;
      }
      char Puffer2[MAXPUF]; //Puffer zum auslesen
    
      int anzahl_aus;
      while(MsgLen!=-1){
      	MsgLen = 0;
      	anzahl_aus= read(Client_Socket,Puffer2,MAXPUF);
      	if (anzahl_aus == -1) {
      		if (errno != EAGAIN){
    			perror("read-error i");
    			return 1;
    		}
      	}
    	//cout << anzahl_aus << " Bytes eingelesen:" << endl; //gibt die Anzahl der gelesenen Bytes aus
    
      	//printf("%c\n", Puffer2[0]); //gibt Inhalt der Datei auf Bildschirm aus
      	cout << Puffer2[0] << endl; //gibt Inhalt der Datei auf Bildschirm aus
      }
    
    }
    


  • Du solltest nachlesen, was gethostbyname alles zurückgeben kann. Vor allem im Fehlerfall ist dies interessant.


Anmelden zum Antworten