(Gelöst) C-Programmierung: TCP/IP Client stürzt ab

Status
Für weitere Antworten geschlossen.

Hauke

New Member
Hallo, ich habe eine Frage, und zwar versuche ich gerade über ein ad-hoc netzwerk eine Verbindung zwischen zwei Rechnern über Sockets aufzubauen. Also damit ist ein Rechner client und der andere server. Der Server haut hin auf SUSE 11.1. Nur der Client bereitet mir Schwierigkeiten indem er diese Meldung ausspuckt:
./hello 192.168.12.11 80
Socket created!
Speicherzugriffsfehler

Also erstellt er einen Socket und kann aber hat dann ein Problem.
Ich habe das Ganze aus einem Beispiel aus Your definite guide to Linux Network Programming.

Vielleicht erkennt ja einer von Euch auf Anhieb wo der Fehler liegt.. die Bibliotheken sind natürlich eingebunden, und das c-Programm wird fehlerfrei kompiliert. :)

Code:
#include <stdio.h>
#include <sys/types.h>		
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>		
#include <string.h>

const char APRESSMESSAGE[] = "Hello - APRESS FROM AND FOR PROFESSIONAL\n";
int main(int argc, char *argv[])
{
	int simpleSocket=0;
	int simplePort=0;
	int returnStatus=0;
	char buffer[256] = "";
	struct sockaddr_in simpleServer;

	if(3 != argc){
		fprintf(stderr, "USAGE %s <port>\n", argv[0]);
		exit(1);
	}

	/*creating streaming socket*/
	simpleSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	
	if(simpleSocket == -1) {
		fprintf(stderr, "Could not create Socket!\n");
		exit(1);
	}
	else {
		fprintf(stderr, "Socket created!\n");
	}
	/*retrieve the port number for connecting*/
	simplePort=atoi(argv[3]);
	
	/*set up the address structure */
	/* use IP adress argument to bind all local addresses */
	bzero(&simpleServer, sizeof(simpleServer));
	simpleServer.sin_family=AF_INET;
	inet_addr(argv[2],&simpleServer.sin_addr.s_addr);
	simpleServer.sin_port=htons(simplePort);

	/* connect to the address and port with our socket*/
	returnStatus=bind(simpleSocket,(struct sockaddr *)&simpleServer,sizeof(simpleServer));
	
	if (returnStatus==0) {
		fprintf(stderr,"Connect successful!\n");
	}
	else {
		fprintf(stderr,"Could not connect to address!\n");
		close(simpleSocket);
		exit(1);
	}
	
	/*get the message from the Server*/
	returnStatus=read(simpleSocket,buffer,sizeof(buffer));

	if(returnStatus > 0 ){
		printf ("%d: %s", returnStatus, buffer);
	}		

	else {
		fprintf(stderr, "Return Status = %d \n", returnStatus);
	}
	
	close(simpleSocket);
	return 0;
}
//Edit (RM): Für Konsolenausgaben/Programmcode CODE-Tags verwenden.

//Edit: Zum zweiten Mal CODE-Tags gesetzt, ab sofort machst Du das dann bitte selbst.

Achja, ich weiß nicht genau welche Adresse ich beim ausführen des Befehls verwenden muss, und welcher Art die zweite Eingabe ist. Deswegen könnte der Fehler also darin begründet sein. Danke RM fürs editieren, das schaffe ich ab jetzt :D
Zum Zweiten könnte es mit dem localhost 127.0.0.1 zusammenhängen??
Wie Ihr seht bin ich noch nicht sehr weit, aber ich werde es nochmal auf einem anderen Weg versuchen, und zwar habe ich diesen Link gefunden.
TCP Echo Server + Client in C › Forum › ubuntuusers.de

Ich glaube da sind bei mir noch einige generelle Unklarheiten, die ich ersteinmal durch anlesen ausmerzen sollte. Also für hints bin ich auch dankbar.

Und hier auch nochmal die Ausgabe nach kompilieren mit -Wall
gcc socketclient.c -o hello -Wall
socketclient.c: In function ‘main’:
socketclient.c:58: warning: implicit declaration of function ‘inet_addr’
socketclient.c:69: warning: implicit declaration of function ‘close’
socketclient.c:74: warning: implicit declaration of function ‘read’

Danke für die Antworten!
 

Jacko

Moderator
AW: Zwei Rechner über Socket verbinden

Folgende Zeile (argv[3] durch [argv[2] ersetzen)

Code:
 simplePort=atoi(argv[[B]2[/B]]);

Grüße Jacko
 

Rain_Maker

Administrator
Teammitglied
AW: Zwei Rechner über Socket verbinden

Und damit man auch weiß, wie das Ding überhaupt zu bedienen ist:

Code:
                fprintf(stderr, "USAGE %s <port>\n", argv[0]);
in

Code:
                fprintf(stderr, "USAGE %s [B]<IP-address>[/B] <port>\n", argv[0]);
ändern.
 

Jacko

Moderator
AW: Zwei Rechner über Socket verbinden

Auf "stderr" sollte man auch wirklich nur Fehler printen, also verwende für normal Ausgaben entweder printf(...) oder fprintf(stdout,...)
 

Hauke

New Member
AW: Zwei Rechner über Socket verbinden

hmm.. ja danke schonmal, das ganze rumprobieren hat mir schon sehr geholfen, jetzt komme ich mit W.Richards Stevens Unix Networkprogramming schon besser klar. Ich denke es wird noch einiges an Zeit vergehen, bis ich was wirklich sinnvolles bastele ;) ich meld mich gerne wieder wenn ich dann weiter bin. :D:D
 
Status
Für weitere Antworten geschlossen.
Oben