.| Autor | Beitrag |
|---|---|
|
000 09.05.2007, 16:49 Felheart |
Hi, ich hab nen LSocket, der wartet einfach auf ankommende clients. (LSocket == ListenSocket) Und ich hab ein Array von CSockets (CSocket == ClientSocket) Wenn eine Verbindung auf'm LSocket eingeht dann will ich das der LSocket Jetzt meine Probleme: 1. Nur den Socket ? Socket und die "SOCKADDR_IN" ? Socket und alles von der Stuctur bis auf SOCKADDR_IN.sin_port = 2. Wie setzt ich den ListenSocket wieder in den Lausch modus ? Muss ich den Socket KOMPLETT neu aufbauen ? Oder kann ich einfach nur wieder listen() machen ? Wäre nett wenn mir einer hier die dinge ein bissel klarer machen würde bzw. wie ihr / wie man das richtig macht. edit: Wenn ich 3 verschachtelte for(;;) Schleifen habe und in der innersten ein break; hört die innerste schleife auf. Dieser Beitrag wurde am 09.05.2007 um 18:29 von Felheart bearbeitet. |
|
Profil || Suche |
|
001 09.05.2007, 19:47 HammerBlade |
Du hast das ganze irgendwie nicht richtig verstanden, scheint mir. Du öffnest mit socket + bind + listen eine Listensocket. Dieser bleibt die ganze Zeit ein Listensocket und offen. Dann rufst du accept mit dem Listensocket auf. Dieses blockt dann bis ein Client connected und gibt dir den Clientsocket sowie die Adresse des Clients zurück. SOCKET accept(SOCKET s, struct sockaddr* addr, int* addrlen); Hier ist s dein Listensocket, addr ist eine sockaddr in die dir accept die Adresse des Clients reinschreibt und der Socket der zurückgegeben wird ist der neu erzeugte Clientsocket. Aus verschachtelten Schleifen kommt man per goto raus (jetzt melden sich gleich wieder die Leute die gegen goto's sind zu Wort) oder indem du im innersten Block einen bool auf true setzt, in jedem Schleifenkopf auf diesen bool prüfst und abbrichst wenn dieser bool true ist. --"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon |
|
Profil || Suche |
|
002 09.05.2007, 21:11 Felheart |
Hey ^^ ich glaub da hab ich mich entweder total falsch ausgedrückt oder Weil GENAU das was du da beschriben hast tu ich doch :) Ich hab mir ne Socket Klasse gemacht, Auf meinem Server mach ich also: ServerSocket LISTEN(1337, true); // parameter: port, listen Für den Server Socket hab ich die Funktionen SOCKET ServerSocket::GetSocket() und ServerSocket::SetSocket(SOCKET _s) und meine frage ist: Muss ich nur den Socket vom LISTEN Socket einem freien Client Slot und 2. Wenn ich vom Listen Socket die verbindung "abgegriffen" habe, Reicht es wenn ich nur ServerSocket::SetListenMode() mach ? edit: Aber wenn ich ein int "ar[5][6][3];" habe, wie änder ich da zum beispiel die 2. dimension ? --Dieser Beitrag wurde am 09.05.2007 um 21:17 von Felheart bearbeitet. |
|
Profil || Suche |
|
003 09.05.2007, 22:45 HammerBlade |
Ah. Der Socket reicht, ausser du willst noch was mit der SocketAddr machen ,die du von accept() bekommst, also anzeigen oder so, weil für recv()/send() brauchst du die ja nicht mehr. Und wie gesagt ein Listensocket bleibt immer im Listenmode, d.h. du musst nichts tun nach einem accept() damit der Listensocket weiter Verbinungen animmt. Du hast einen int ar[5]; auf dem Stack und ändert den mit realloc? Das ist nicht gut! Du meinst nicht int* ar = malloc(5 * sizeof(int)); ? Auf dem Stack sollte dir realloc um die Ohren fliegen. Die Grösse von Arrays auf dem Stack kannst du garnicht ändern. Du kannst das nur ändern wenn du das mit malloc gemacht hast. --"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon |
|
Profil || Suche |
|
004 10.05.2007, 11:23 oxff |
Wenn man realloc auf einen Stack-Pointer anwendet, kann man relativ lustige Effekte erzielen. Dann werden die Daten dadrüber (wenn der Stack-Pointer oben ist, sind das dann sogar lokale Daten von einer vorherigen Prozedur) als Heap-Header interpretiert und irgendwo dann hingeschrieben. Bzgl. der Ports usw.: Fahr dir mal rein, wie TCP funktioniert. Du hast das offensichtlich noch nicht verstanden. --mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |
|
005 10.05.2007, 11:51 Felheart |
accept(); lieftert nur INVALID_SOCKET edit: Hier hab ich mal meine accept funktion: Doch das mein ich ^^ ups. Ja, davon kann man die grösse ja ändern mit realloc. Jetzt frag ich mal andersherum: Wie kann ich dann mittels malloc ein array allozieren das mehrere dimensionen hat ? Beispiel: int ar[5]; // Static und int ar[5][5][5]; // Static Dieser Beitrag wurde am 10.05.2007 um 11:56 von Felheart bearbeitet. |
|
Profil || Suche |
|
006 10.05.2007, 11:57 oxff |
Zwei Möglichkeiten:
mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |
|
007 10.05.2007, 12:24 Felheart |
Thx, das funkt. Aber das mit den Sockets liegt immernoch im argen... Listen + Accept -> Der ListenSocket soll wieder verbindungen annehmen können -> Listen schlägt fehl und meldet per GetLastError das der Socket ja schon Also wie lösch ich die verbindung vom dem ListenSocket nachdem ich edit: Wenn ich vor Listen+Accept den Socket auf 0 setzte kommt das das angegebene Objekt kein Socket ist edit2: Wenn ich nen neuen Socket haben will (per socket(...)) dann kommt Dieser Beitrag wurde am 10.05.2007 um 12:28 von Felheart bearbeitet. |
|
Profil || Suche |
|
008 10.05.2007, 12:33 oxff |
Bist du ein bisschen dumm? :>
mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |
|
009 10.05.2007, 12:48 Felheart |
Ne ich bin ned dumm... es tut nur einfach nich! Wenn ich es so mache wie du es da hast und nach dem abgreifen der Verbindung einfach wieder accept(); für den ListenSocket aufrufe liefert mir und per GetLastError(); "10022: Ein ungültiges Argument wurde angegeben." Meine Accpet funktion hab ich oben schon gepostet... edit: wenn ich deinen code in nem neuen project ausfühere: GetLastError: 10038:Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist. ich vermute weil du einen per closesocket geschlossenen socket nicht mehr edit2: Ahhhhhhh! Die erleuchtung :D SOCKET is ja sozusagen blos ein zeiger auf eine Verbindung. und weil mein Client gerade mit dem arbeitet / weil er noch connected is, D.h. -> in meiner ServerSocker::Listen(); funktion muss also der edit3: dann... gehts immer noch nich -___- edit4: Jetzt schlägt nur noch bind() beim neuen socket fehl weil der alte port noch hier soweit mal mein ServerSocket::Listen()
Dieser Beitrag wurde am 10.05.2007 um 13:36 von Felheart bearbeitet. |
|
Profil || Suche |
|
010 10.05.2007, 15:43 theDon |
Du hast es immer noch nicht gerafft:
\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
011 10.05.2007, 16:35 Felheart |
:/ Oder ich könnte die Accept funktion der Klasse so umschreiben das sie direkt den neuen Socket returnt (bei nem fehler halt 0) Wie auch immer, danke fürs Beispiel! --Dieser Beitrag wurde am 10.05.2007 um 19:25 von Felheart bearbeitet. |
|
Profil || Suche |
|
012 10.05.2007, 19:18 oxff |
Erhaeng dich. Du bist dumm. --mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |
|
013 10.05.2007, 20:19 HammerBlade |
Letzter Versuch:
"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon |
|
Profil || Suche |
|
014 11.05.2007, 15:30 Felheart |
Ok, habs verstanden. Bei HammerBlades bespiel ist jetzt der groschen gefallen das ich garned |
|
Profil || Suche |
|
015 11.05.2007, 22:30 Felheart |
Sie können diesen Post nicht mehr editieren. (Zeitlimit überschritten) |
|
Profil || Suche |
|
016 12.05.2007, 15:32 oxff |
Wie soll denn select wissen, wie lange du stillschweigen akzeptierst? --mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |

