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.