WinSock2 bind() Error: 10048



  • Hallo,

    im Moment programmiere ich ein kleines Chatprogramm. Hauptsächlich um die WSA kennen zu lernen.

    Jetzt habe ich folgendes Problem, ich probiere mit connect() eine Verbindung zu einem Server aufzubauen, wenn keine Verbindung aufgebaut werden kann, wird der Client zu einem Server und ist im listen()-Modus. Aber beim dem Befehl bind() kommt es zu einem Fehler ( #10048 ). Dieser Fehler steht für WSAEADDRINUSE. Wie kann ich nun die "Spuren" des connect()-Versuchs wieder löschen? Also alles so zu sagen wieder auf 0 setzen? Oder gibt es eine andere Möglichkeit?

    Hier mein Code:
    http://rafb.net/p/5lez0C15.html

    Danke im Vorraus,
    hmstr



  • 1. mal in der msdn gesucht?

    2. ist das das falsche forum - gibt nen winapi unterforum - das wäre richtig gewesen...

    3. du solltest variablen auch erst dort deklarieren, wo sie gebraucht werden... so was wie

    MyWinSocket mysock;
    
        SOCKET s, acc_s , x;
        int tryCon, rc;
        sockaddr_in addr;
        string msg;
        char buf[256];
        char ha[200];
    

    ist und bleibt hässlich...

    mysock.StartSocket(s);
        mysock.StartSocket(x);
    

    Warum schreibst du ne gleich ne Klasse, die den Socket an sich auch beinhaltet?

    bb



  • Ja mit dem Forum sorry.

    Aber irgendwie hat mir das jetzt auch nicht weiter geholfen.



  • http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx schrieb:

    The socket's local address is already in use and the socket was not marked to allow address reuse with SO_REUSEADDR

    Also wirst du wohl mal suchen müssen, wie du ihn als SO_REUSEADDR marken kannst, wenn ich das richtig verstanden habe...

    bb



  • BOOL ReuseAddr = TRUE;

    MySock->SetSockOpt(SO_REUSEADDR, (LPVOID)&ReuseAddr, sizeof(BOOL), SOL_SOCKET);

    soo, aber ich will ja kein socket nochmal nutzen. Ich hab ja 2 verschieden Sockets: s und x



  • hmstr schrieb:

    Wie kann ich nun die "Spuren" des connect()-Versuchs wieder löschen?

    Den Socket wieder schließen.



  • Ja aber das bringt ja irgendwie alles nix auch wenn ich mit dem Socket s keien Ahnung was mache. Der bind() - Befehl wird ja mit Socket x gemacht.



  • Stimmt, übersehen.
    "unskilled"s Tipp mit SO_REUSEADDR hört sich gut an. Dabei geht's auch nicht darum, dass du einen Socket zweifach benutzen willst, sondern es greift, wenn der Port, an den du dich binden willst, schon von einem anderen Socket "besetzt" ist.



  • Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also habe jetzt die 2 Sockets auf SO_REUSEADDR gesetzt. Jetzt klappt das auch mit dem bind. Also beim ersten mal wird der Socket in den listen()-Modus gesetzt, aber dann beim zweiten mal ausführen kann er trotzdem nicht connecten. Fehlercode #10061. Aber irgendwie kann ich nichts nützliches finden.. Jemand eine Idee woran das liegen kann?

    Danke,
    hmstr



  • Hallo und Guten Tag,

    ich verstehe nicht so recht wo Du Dein Problem hast, kann Dir aber sagen dass ich z.Zt. ein Projekt bearbeite bei dem 3 Computer (2 Win-Xp, 1 HP-Unix) in einem 200ms Takt per Client/Server (Socket-Verbindungen) miteinander arbeiten und einer der Windows Computer dann noch eine zusätzliche rechnerinterne Client/Server Aufgabe zu erfüllen hat,

    alles läuft hervorragend und sozusagen "bis zum Sankt Nimmerleinstag" wenn Du Dich an die Vorschriften hältst:

    CLIENT:
    - ... WSAStartup ... (einmalig)
    - ... gethostbyname ... (einmalig)
    - ... getservbyname ... (einmalig)

    - ... remote_address.sin_family ... (einmalig)
    - ... remote_address.sin_port ... (einmalig)
    - ... remote_address.sin_addr ... (einmalig)

    - ... socket ... (zyklisch)
    - ... connect ... (zyklisch)
    - ... send/recv ... (zyklisch)
    - ... closesocket ... (zyklisch)

    - ... closesocket ... (einmalig)

    SERVER:
    - ... WSAStartup ... (einmalig)
    - ... gethostbyname ... (einmalig)
    - ... getservbyname ... (einmalig)
    - ... socket ... (einmalig)

    - ... local_address.sin_family ... (einmalig)
    - ... local_address.sin_port ... (einmalig)
    - ... local_address.sin_addr ... (einmalig)

    - ... bind ... (einmalig)
    - ... listen ... (einmalig)

    - ... accept ... (zyklisch)
    - ... recv/send ... (zyklisch)
    - ... closesocket ... (zyklisch)

    - ... closesocket ... (einmalig)

    Vielleicht und Hoffentlich hilft Dir Vorstehendes einwenig weiter,

    mfg

    ZZR-1100



  • Ich habe das Problem jetzt gelöst. Aber bin mir sicher das mir das trotzdem bei der weiteren Arbeit mit Sockets weiter hilft. Vielen Dank.

    Klappt jetzt alles so weit 😉 Danke


Anmelden zum Antworten