|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.12.2007, 15:27 Titel: Socket Problem |
|
|
Hi,
Ich habe einen Client und Server geschrieben.
Der Server ist im listen Modus und fängt Clienten über den Port 12128 ab und speichert die verbundenen sockets ab um nach weiteren Clienten zu lauschen.
Soo jetzt zum Problem:
Der Server soll 2 ports haben. Einmal 12128 für den listen modus und einmal 13138 für verbundene Clienten.
Dass heißt, wenn accept jetzt einen verbundenen socket rauswirft, soll dieser socket nicht mehr über port 12128 laufen, sondern über port 13138!
wie kann ich das realisieren??
Ich muss ja irgendwie den socket editieren oder?
Ich habs soo versucht:
Code: | int connectedsocket(SOCKADDR_IN a)
{
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM , 0);
if(clientSocket == INVALID_SOCKET)
{
AddText("Client-Fehler: Socket konnte nicht erstellt werden!");
return 1;
}
else
{
AddText("Client-Socket erstellt!");
}
addr2.sin_family = AF_INET;
addr2.sin_port = htons(13138);
addr2.sin_addr = a.sin_addr;
test = bind(clientSocket, (SOCKADDR*)&addr2, sizeof(SOCKADDR_IN));
if(test == SOCKET_ERROR)
{
AddText("Client-Fehler: Bind nicht möglich");
FehlerCode();
return 1;
}
else
{
AddText("Client-Socket an Port 13138 gebunden!");
}
} |
Aber das klappt nur local, also 127.0.0.1 im Internet kommt der FehlerCode 6, also:
Zitat: | Specified event object handle is invalid.An application attempts to use an event object, but the specified handle is not valid. Note that this error is returned by the operating system, so the error number may change in future releases of Windows.
|
Aber was heißt das jetzt??
Firewall ist aus Ports sind offen ... _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 29.12.2007, 16:00 Titel: |
|
|
Du kannst den Port einer TCP-Verbindung ja nicht einfach ändern. Eine TCP-Verbindung ist ja immer an Quell-Adresse/Port und Ziel-Adresse/Port gebunden. Das kannst du ja nicht einfach ändern, sobald sie aufgebaut wurde. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 29.12.2007, 16:04 Titel: |
|
|
Moin.
Ich stelle mir ja erstmal die Frage, warum du das überhaupt trennen willst.
Weil: Es ist überhaupt kein Problem alle Verbindungen über einen Port laufen zu lassen. Das OS erkennt ganz gut, wann eine neue Verbindung ankommt, und was zu einer bereits bestehenden Verbindung gehört.
Aber um zu deinem Problem zurückzukommen:
Soweit ich weiß, geht das so nicht. Du musst auf dem 12128 ja erstmal die Verbindung akzeptieren. Aber eine akzeptierte Verbindung kann ihren Port nicht mehr ändern. Das heißt, wenn du die Verbindung auf 12128 akzeptierst, ist sie dadrauf festgelegt. Und eine Verbindung die auf 12128 rein kam, kann man nicht für einen anderen Port akzeptieren.
Das einzige, was du machen kannst, ist, dass du den Client so schreibst, dass der Server sagen kann: "Verbinde dich bitte neu zu mir auf Port 13138." Wobei ich denke, dass das nicht viel Sinn macht, da der Client dann seine Verbindung auch direkt zu 13138 aufbauen kann.
Was deinen Code angeht versteh ich den Sinn dahinter noch nicht ganz:
Du erzeugst einen Socket, der, nachdem die Funktion beendet ist, sofort wieder erlischt, da er ja nur lokal ist.
Gruß
FH
<edit>
Da war wer schneller...
</edit> _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
RebornX JLI'ler
Anmeldedatum: 16.03.2007 Beiträge: 169
Medaillen: Keine
|
Verfasst am: 29.12.2007, 19:26 Titel: |
|
|
Ich habe da der funktion die SOCKADDR_IN structur übergeben die accept ausgefüllt hat^^
und dann habe ich einen neuen Socket mit den Daten der structur a ausgefüllt, also ip und der neue port...
und dann wollt ich ihn halt an den neuen port binden...
eigenartig finde ich, das der client wenn ich ihn local teste, also über 127.0.0.1, mit dem server verbindet!
Ach ja und der SOCKET da ist global^^ .... wollte damit eigentlich nur verdeutlichen dass das ein neuer socket, leerer ist und habe nicht drauf geachtet das der da nicht global ist... im projekt ist er global .
edit//:
ok hat sich erledigt, habe jetzt die Idee von FH eingesetzt thx _________________ Besucht meine Seite:
www.cpparchiv.dl.am |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 30.12.2007, 02:24 Titel: |
|
|
Betreff Socket: Achso, ok. Hatte mich gewundert, warum der nicht global ist.
KA, warum das lokal funzt. Wahrscheinlich baut Windows da mal wieder irgendwas intern, es sollte auf jeden Fall nicht funktionieren. Warum es das lokal doch tut is ne gute Frage.
Btw.: Das gehört IMO ins Entwicklungs-Forum, weil es ja keine Frage zum Buch ist, soweit ich das sehen kann. Hab es also mal verschoben.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|