Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.12.2007, 15:34

Winsock 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:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 ...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

29.12.2007, 15:54

De facto bekommt jeder Client, der sich zu dir Verbindet einen eigenen Socket zugeordnet (nach meinem Kenntnisstand). Auch stellt sich mir direkt die Frage: Wozu soll das gut sein?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

29.12.2007, 15:59

Zitat von »"Nox"«

Auch stellt sich mir direkt die Frage: Wozu soll das gut sein?


Naja ich will den listen port nicht überlasten. Dh. wenn große Mengen Daten übertragen werden, ist der port ja blockiert und kann solange nicht nach weiteren connections lauschen^^
Deswegen will ich die communication zwischen client + server über einen extra port machen ^^.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

29.12.2007, 16:23

Also ich glaube einer von uns beiden hat das mit den Ports/Sockets missverstanden. Die Frage ist nun wer von uns beiden :?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

29.12.2007, 16:25

Zitat von »"Nox"«

Also ich glaube einer von uns beiden hat das mit den Ports/Sockets missverstanden. Die Frage ist nun wer von uns beiden :?


Wie hast du es denn verstanden ??

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

29.12.2007, 17:38

Tja, bei dem Thema "Unterschied ziwschen Port und Socket" hört man viel...
Im Endeffekt ist allerdings der Port über den den Server die Clients empfängt nur für den Empfang der neuen Clients zuständig. Sobald ein Client sich erfolgreich angemeldet hat, werden die Daten an den Socket weitergeleitet, der dem Client zugeordnet wurde. Also ich bezweifel ernsthaft, dass durch Datenübertragung von/zu den Clients der accept()-Vorgang massiv gestört wird.
Allerdings ist das ein Thema, dass schon recht tief in das OS geht und ich bin mir nicht sicher, ob und wenn ja wie das Problem allgemeingültig gelöst wird.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

29.12.2007, 20:48

ok hat sich erledigt ^^ .... Habe jetzt ne andere Möglichkeit gefunden die auch ganz gut funktioniert:
Sobald ein Client sich mit dem listen port verbunden hat schickt der server eine nachrticht dem clienten das er abjetzt zum "connection port" connecten soll.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

29.12.2007, 22:53

Ganz ehrlich? Ich glaube das ist mehr als unnötig :roll: , aber gut ist deine Sache ;)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

30.12.2007, 10:38

Ich geb dir mal nen Tip:

accept liefert dir eine sockaddr Struktur als Ergebnis mit (wenn du dort keine NULL als Argument übergibst). Dort steht dann auch drin, auf welchem Port der Socket verbunden ist.

PS: Auflösung der kryptischen Aussage: jede neue Verbindung bekommt einen eigenen Port zugewiesen.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

10

08.01.2008, 09:26

Zitat von »"RebornX"«

ok hat sich erledigt ^^ .... Habe jetzt ne andere Möglichkeit gefunden die auch ganz gut funktioniert:
Sobald ein Client sich mit dem listen port verbunden hat schickt der server eine nachrticht dem clienten das er abjetzt zum "connection port" connecten soll.


Nur mal so als Randbemerkung. Wenn du einen zweiten Socket verwendest der Verbindungen akzeptiert, bringt dich das wieder zu deinem Ursprünglichen Problem :!:

Generell würde ich mich darauf verlassen das dein OS schon alles richtig macht, denn die Wahrscheinlichkeit das du es mit einem Programm, dass darauf läuft, besser machst ist sehr gering.

Da die Netzwerkkarte physisch ( also eigentlich elektrisch ) gesehen eh alles durcheinander bekommt und richtig einsortieren muss, kannst du dich eigentlich darauf verlassen das dein Accept das kleinste Problem an der ganzen Sache ist :)

Werbeanzeige