# Socket Programmierung



## Silvercreast (28. November 2005)

Hallo 

mein Problem bezieht sich auf die Socket Programmierung und zwar habe ich für den Client folgenden Code geschrieben:


```
SOCKET MySocket;
	char serverip[20];
	sockaddr_in addr;
	WSADATA wsaData;

	if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
	{
		MessageBox(0,"WSA konnte nicht initialisiert werden","Fehler",MB_OK);
		return false;
	}

	hostent* dns = gethostbyname("FuhrparkServer");
	sprintf(serverip, "%u.%u.%u.%u",(unsigned char) dns->h_addr_list[0][0],
		(unsigned char) dns->h_addr_list[0][1], (unsigned char) dns->h_addr_list[0][2], 
		(unsigned char) dns->h_addr_list[0][3]);

	addr.sin_family = AF_INET;
	addr.sin_port = htons(110);
	addr.sin_addr.s_addr = inet_addr(serverip);

	MySocket = socket( AF_INET, SOCK_STREAM,0);

	if(MySocket == 0)
	{
		MessageBox(0,"Socket konnte nicht initalisiert werden","Fehler",MB_OK);
			return false;
	}

	if(connect(MySocket, (sockaddr *) &addr, sizeof(addr)) == -1)
	{
		MessageBox(0,"Es konnte keine Verbindung aufgebaut werden","Fehler",MB_OK);
		return false;
	}

	return true;



}
```

Den Code habe ich von hier aus einem anderen Thread. Habe dann von einer Internetseite die mir hier auch empfohlen wird einen Server Code erstellt:


```
SOCKET MySocket;
	char serverip[20];
	sockaddr_in addr;
	sockaddr_in remote_addr;
	WSADATA wsaData;
	int size;
	int remote_sock;

	if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
	{
		MessageBox(0,"WSA konnte nicht initialisiert werden","Fehler",MB_OK);
		return false;
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(110);
	addr.sin_addr.s_addr = INADDR_ANY;

	MySocket = socket( AF_INET, SOCK_STREAM,0);

	if(bind(MySocket, (sockaddr* ) &addr, sizeof(addr)) == -1)
	{
		MessageBox(0,"Socket konnte nicht initalisiert werden","Fehler",MB_OK);
			return false;
	}

	if(listen(MySocket,1) == -1)
	{
		MessageBox(0,"Es konnte keine Verbindung aufgebaut werden","Fehler",MB_OK);
		return false;
	}

	fflush(stdout);

	size = sizeof(remote_addr); 
	remote_sock = accept(MySocket,(sockaddr* ) &remote_addr, &size);
	fflush(stdout);

	if(remote_sock < 0)
	{
		_close(MySocket);
		MessageBox(0,"Socket geschlossen","Hinweis",MB_OK);
		return false;
	}


	fflush(stdout);

	size = send (remote_sock,"Wilkommen",11,0);
	
	if(size == -1)
	{
		MessageBox(0,"Fehler","Fehler",MB_OK);
	}
	else
	{
		MessageBox(0,"Gesendet","Hinweis",MB_OK);
	}
	

	_close(remote_sock);
	_close(MySocket);
	fflush(stdout);

	return true;



}
```

Wie ich aber erkennen musste funktiniert gar nichts. Der Compiler hift mir nicht mehr der sagt alles ok, ich weiss net was ich falsch mache . Hab ich irgendwelche Bugs im Code oder wieso funktioniert das alles nicht.
Ich dachte das sich der Client verbindet und der Server ein Wilkommen zurück schickt aber nichts geht

Ich brauche dringend Hilfe

Gruß Silver


----------



## TwoFaze (28. November 2005)

Wie siehts den mit dieser Zeile aus

```
hostent* dns = gethostbyname("FuhrparkServer");
```

Ist das dein Host?


----------



## Silvercreast (28. November 2005)

So heist mein Server , muss da nicht der Name meines Servers rein


----------



## TwoFaze (28. November 2005)

Probiers doch mal mit "localhost" !
Dein Programmname vom Server hat hier eigentlich nichts zu suchen!


----------



## Silvercreast (28. November 2005)

achso ich dachte da müsste ich meinen Server eintragen.
Ok danke jetzt sagt er mir zumindestens  das keine Verbindung aufgebaut werden kann.
Kannst du mir eventuell noch helfen wie ich den Code verändern muss, damit ich ne Verbindung kriege


----------



## TwoFaze (28. November 2005)

Das einzige was ich sehen kann (ich vermute du startest den Client vor dem Server  ) ist die Stelle

```
addr.sin_addr.s_addr = INADDR_ANY;
```
Versuche mal das INADDR_ANY durch ADDR_ANY zu ersetzen?

```
addr.sin_addr.s_addr = ADDR_ANY;
```
gruß!

edit: Wobei, dass ist Quatsch, sonst würde dein Server ja garnicht kompilieren, sorry!!
Wäre vielleicht doch hilfreich, wenn du genauere Fehlermeldungen deines Clients/Servers schreiben würdest!


----------



## RedWing (28. November 2005)

Silvercreast hat gesagt.:
			
		

> achso ich dachte da müsste ich meinen Server eintragen.
> Ok danke jetzt sagt er mir zumindestens  das keine Verbindung aufgebaut werden kann.
> Kannst du mir eventuell noch helfen wie ich den Code verändern muss, damit ich ne Verbindung kriege



Hallo,

hast du deinen Server auch vorher am localhost:110 gestartet?

Gruß

RedWing


----------



## Silvercreast (28. November 2005)

@ TwoFaze mein Server und mein Client geben keine Fehlermeldung raus

@ RedWing ich habe meinem Server nur den Port 110 gegeben, wie im Code


----------



## RedWing (28. November 2005)

Silvercreast hat gesagt.:
			
		

> @ TwoFaze mein Server und mein Client geben keine Fehlermeldung raus
> 
> @ RedWing ich habe meinem Server nur den Port 110 gegeben, wie im Code



ja hast du ihn auch gestartet?Das war meine Frage nur um sicher zu gehen
das der Fehler auch wirklich im Code liegt 

Gruß

RedWing


----------



## Silvercreast (28. November 2005)

Ja Ja ich habe den Server gestartet und dann den Client


----------



## RedWing (28. November 2005)

Und wie schauts aus, kommt der Server auch ohne Fehlermeldungen
bis zum accept? Eventuell ist der Port 110 bzw Socket auch schon durch 
einen anderen Dienst belegt, dann sollte eigentlich ein Fehler
beim bind() entstehen...

Gruß

RedWing


----------



## Silvercreast (28. November 2005)

Wie kann ich das den Kontrollieren? Ich kann per Debug nicht das accept überprüfen.


----------



## TwoFaze (28. November 2005)

Soweit ich das deinem Server oben entnehmen kann, macht er Fehlerausgaben bei "bind" und "connect", da sollte dann eigentlich was stehen!
Wenn du dich wirklich für den Fehler interessierst, dann spiel ein bischen mit deiner Anwendung rum und experimentiere. Vielleicht könntest du auch, um ein lauffähiges Beispiel zu bekommen und auch ein bischen Hilfestellung zu haben bei
http://www.c-worker.ch
vorbeischauen, da ist eigentlich auch alles für den Einstieg schritt-für-schritt erklärt.
Kannst ja dann auch hier berichten an was es lag..

PS.: Bin auch Azubi Fachinformatiker AE


----------



## Silvercreast (28. November 2005)

Natürlich interessiert es mich voran das liegt, ich bin momentan auch nen bischen Ratlos were mich mal durch die Seiten durchackern


----------



## RedWing (28. November 2005)

Hallo versuchs mal bitte so bei deinem Client:
anstatt:

```
addr.sin_addr.s_addr = inet_addr(serverip);
```
so:

```
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
```

Ich vermute das die ip bei deinem Bsp nicht richtig extrahiert wird...

Gruß

RedWing


----------



## Silvercreast (28. November 2005)

Hmm der scheitert immer noch an dem Connect.


----------



## Silvercreast (28. November 2005)

Hab ich irgend was beim empfangen der Daten falsch gemacht


----------



## RedWing (28. November 2005)

Silvercreast hat gesagt.:
			
		

> Hab ich irgend was beim empfangen der Daten falsch gemacht



Hm ich hab leider kein Windows kanns dementsprechend nicht testen.
Die Socketpürogrammierung unter Linux ist recht ähnlich.
Also hier mal folgendes Gerüst unter Linux was bei mir funktioniert:

Server:


```
int main(){
    struct sockaddr_in serveraddr;
    struct sockaddr client;
    int sdesc = 0;
    int cdesc = 0;
    int size = sizeof(client);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(4444);
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    sdesc = socket(PF_INET, SOCK_STREAM, 0);
    bind(sdesc, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    listen(sdesc, 1);
    cdesc = accept(sdesc, &client, &size);
    return 0;
}
```

Client:


```
int main(){
    struct sockaddr_in serveraddr;
    int cdesc = 0;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(4444);
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cdesc = socket(PF_INET, SOCK_STREAM, 0);
    connect(cdesc, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    return 0;
}
```


Vielleicht hilfts dir ja a weng weiter. 

Gruß

RedWing


----------



## Silvercreast (29. November 2005)

Habe den Fehler gefunden und zwar waren es ganz simple Fehler (Auf die man aber erstmal kommen muss).
In meinen Codes musste die WSAStartup entfernt werden:


```
//	WSADATA wsaData;


/*	if (WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
	{
		MessageBox(0,"WSA konnte nicht initialisiert werden","Fehler",MB_OK);
		return false;
	}*/
```

Da schon automatisch die AfxSocketInit() erstellt wird , diese AfxSocketInit() übernimmt bzw enthält schon die WSAStartup Funktion. Deswegen hatte mein Programm vorher Probleme mit der Verbindung gehabt.


----------

