Threads und Socket Programmierung

In meinem Source habe ich das WSAAsyncSelect erst nach dem bind aufgerufen. Ich würde auch alle Events prüfen, dann bekommst du auch mit, wenn sich jemand verabschiedet bzw. Daten schickt oder Daten da sind.

Also so: FD_ACCEPT | FD_WRITE | FD_READ | FD_CLOSE
 
So ich hab mal einfach in der Initialisiererliste, den Standard Konstrukor vom fenster aufgerufen. und das WSAAsyncSelect nach dem binden aufgerufen, noch immer liefert es einen Fehler zurück.
Zudem soll der Server socket auch nur akzeptieren, gelauscht soll dann auch den angenommenen Verbindungen Sockets, die später erstellt werden. Aber erstmal würde ich gerne wissen wo da der Fehler liegt, das es so überhauptnicht funktioniert.
Code:
ServerNetzwerk::ServerNetzwerk(ServerOperator* psoOperator)
: vVerwaltung(), zeit(), fenster()
{
	this->psoOperator = psoOperator;
	string sRueckmeldung;

	//Netzwerkstarten
	// Winsock starten
	sRueckmeldung = startWinSock();
	this->psoOperator->meldungEingegangen(&sRueckmeldung);
	//Socket Konfigurieren
	sRueckmeldung = socketErstellen(serverSocket);
	this->psoOperator->meldungEingegangen(&sRueckmeldung);
	//Socket auf weiteres Fenster umleiten
	//sRueckmeldung = aufFensterUmleiten(serverSocket, fenster, FD_ACCEPT);
	//this->psoOperator->meldungEingegangen(&sRueckmeldung);
	//Socket an den Port binden
	sRueckmeldung = binden(serverSocket, coniPORT);
	this->psoOperator->meldungEingegangen(&sRueckmeldung);
	//Socket auf weiteres Fenster umleiten
	sRueckmeldung = aufFensterUmleiten(serverSocket, fenster, FD_ACCEPT);
	this->psoOperator->meldungEingegangen(&sRueckmeldung);}
Muss ich vielleicht noch etwas includieren?
Code:
#include "ServerNetzwerk.h"
#include "ClientenVerwaltung.h"
#include <vector>
#include <algorithm>
#include <time.h>
#include <windows.h>
#include "netzwerk.h"
#include "ServerOperator.h"
winsock2 hab ich bewusst nicht includiert, da dieses ja schon in windows enthalten ist und immer nen Fehler aufruft wenn ich beides includiere.
 
Prüf doch mal, welchen Fehler WSAAsyncSelect wirklich zurückgibt. Da gibt es die WSAGetLastError-Funktion dafür.

Die Fehlercodes und deren Beschreibung sind etwas versteckt in der MSDN gelagert, aber die geben meistens einen guten Hinweis auf das eigentliche Problem.
 
Also ich bekomme den Fehlercode 10022. was zuviel bedeutet das ich ein falsches Argument auf den Socket angewendet hab. Dieses bekomme ich nun bei beiden Server und Client. Ohne WSAAsyncSelect läuft es ja soweit, also muss ich da wohl n falsches Argument anwenden. Ich denk mal der Fehler liegt dann wohl im Aufruf vom WSAAsyncSelect.
Code:
void ClientNetzwerk::start(char* pcIP, u_short iPort)
{	
	//Winsockets starten
	sMeldung = startWinSock();
	this->poOperator->meldungEingegangen(&sMeldung);
	//Socket TCP/IP Tauglichen machen (Konstruktor aufruf)
	sMeldung = socketErstellen(clientSocket);
	this->poOperator->meldungEingegangen(&sMeldung);
	//Socket auf weiteres Fenster umleiten
	sMeldung = aufFensterUmleiten(clientSocket, fenster, FD_ACCEPT | FD_WRITE | FD_READ | FD_CLOSE);
	this->poOperator->meldungEingegangen(&sMeldung);
	//Zum Server verbinden
	sMeldung = connectTo(clientSocket, "127.0.0.1", 1000);
	this->poOperator->meldungEingegangen(&sMeldung);
}
Code:
string aufFensterUmleiten(SOCKET& rSocket, HWND& rFenster, long iEvent)
{
	long iFehlermeldung = WSAAsyncSelect(rSocket,	rFenster, coniWM_SOCKET, iEvent);
	string sRueckgabe;

	//Möglichen Fehler zurückliefern
	if (iFehlermeldung == SOCKET_ERROR)
	{
		sRueckgabe = "WSAAsyncSelect liefert einen Fehler zurück. Fehlercode: ";
		char cFehler[7];
		itoa(WSAGetLastError(), cFehler, 10);
		sRueckgabe.append(cFehler);
	}
	else
	{
		sRueckgabe = "WSAAsyncSelect erfolgreich gestartet.";
	}

	return sRueckgabe;
}
liegt es denn vielleicht am Fenster? Mit dem weiß ich noch am wenigsten etwas anzufangen.
 
Ist der socket gültig? (Sollte er dem Code nach)
Ist das HWND gültig?

Lass dir mal die Werte der einzelnen Parameter ausgeben (am besten Hex). Dann könnte man einfache Ungereimtheiten direkt erkennen.
 
Also beim Socket gehe ich davon aus das er gültig is, weil der Client ne Meldung ausspuckt ob er zum Server verbunden hat (Je nachdem ob ich einen Server am laufen hab mit verbunden/nicht verbunden).
Was das HWND angeht, keine Ahnung, ich weiß ja nicht mal so richtig was das ist und wie ich damit eigentlich umgehen muss.
Und wie kann ich mir, welche einzelnen Parameter als Hex-Werte ausgeben lassen?
Hatte nur ein paar Einführungsvorlesungen zu C++ und VS. Hab mich wie gesagt nur ans Netzwerk ran getraut weil ich dazu Tutorials hatte und dieses unter Java schon behersche.
 
Das HWND musst du dir irgendwo erstellen lassen, ich vermute mal, dass du da auch eine Hauptapplikation rumfliegen hast. Also müsste theoretisch irgendwo ein CreateWindow oder DialogBox rumfliegen. Davon war ich eigentlich ausgegangen.

Deren HWND sollte da übergeben werden.

Die billigste Variante, etwas Hex auszugeben, wäre mal eben so (%x als Formatierungsparameter):

char szTemp[260];
wsprintf( szTemp, "HWND: %x", hwndVariable );
 
Also bislang habe ich eine reine Konsolen Anwendung (bin ja nur fürs Netzwerk zuständig).
Das ganze Programm soll später eine CLR: Windows-Forms-Anwendung werden.
Also kann ich son HWND einfach mit createWindow erzeugen?

Habe wsprintf ausprobiert, aber er meint das die Parameter falsch sind also hab ich es wie folgt abgeändert:
Code:
wsprintf( (LPWSTR)szTemp, (LPCWSTR)"HWND: %x", fenster );
Ich habe es auch mal mit printf ausprobiert, da bei der Abänderung nichts sinvolles bei rauskam:
Code:
printf("HWND: %x", fenster);

Die Ausgabe sind nun so aus:
HWND: 0

Jedoch liefert ja wsprintf nen Integer wert zurück, dieser Ausgegeben ist 4.
 
Zuletzt bearbeitet:
Ach, du hast Unicode aktiviert. Deshalb klappte das mit wsprintf nicht. Das klappt dann in der oberen Variante auch nicht.

Das untere war schon richtig. Da sieht man, dass du kein HWND hast (0 ist ungültig). Daran scheitert auch WSAAsyncSelect

Du müsstest dir also schon über CreateWindow ein Fenster erzeugen (und da über die Klasse die Message-Behandlung anfügen). Ich glaube aber langsam, dass du dir da ganz schön was vorgenommen hast.

Wenn du vorher noch nie mit Fenster gearbeitet has, dann ist das Thema da schon etwas fortgeschrittener.
 
Naja da muss ich jetzt durch. Hab ja bis zum 30.9 Zeit, wäre schon schön wenn wir vllt das dahin es zhinkriegen würden :rolleyes:
Ich hab erstmal n kleines Tutorial zu Fenstern gefunden, werde wohl dieses erstmal durch arbeiten bis ich ein kleines Fenster zu Stande bekomme ;-)

Und wie kann man Unicode einfach abstellen, oder ist es ok, wenn ich immer umcaste?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück