TCP Port lokal auf INADDRY_ANY binden
-
Guten Morgen zusammen,
ich versuche einen TCP Port lokal auf INADDRY_ANY zu binden. Danach connecte ich mich auf einem anderen Server mit dem selben Port.
So wie ich es derzeit mache habe ich nach dem connect eine Verbindung zwischen meiner netz ip und dem remote server. Möchte aber das auch nach dem Connect der Port local auf 0.0.0.0 gebunden ist.Hier mal mein Vorgehen:
if((m_sslSock = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) return false; SOCKADDR_IN sAddr = m_RemoteSockAddr; sAddr.sin_port = htons(5061); int x = 1; SOCKADDR_IN sLocal; sLocal.sin_addr.s_addr = htonl(INADDR_ANY); sLocal.sin_family = AF_INET; sLocal.sin_port = htons(5061); int nRes = 0; setsockopt(m_sslSock, SOL_SOCKET, SO_REUSEADDR, (char*)&x, sizeof(x)); if((nRes = bind(m_sslSock, (const struct sockaddr *)&sLocal, sizeof(SOCKADDR))) == SOCKET_ERROR) return false; if(connect(m_sslSock, (SOCKADDR*)&sAddr, sizeof(sAddr)) == SOCKET_ERROR) { DWORD dwErr = WSAGetLastError(); return false; }
Ich hab das bisher in allen Beispielen die ich dazu finden konnte genauso gesehen.
Gruß
CrazyPlaya
-
bind() macht nur Sinn für auf eingehende Verbindungen wartende Sockets. Sobald eine Verbindung besteht, besteht die immer zwischen konkreten IP/Port-Paaren.
-
Jap das ist absolut richtig.
Aber hier ists etwas anders.
Mal kurz zum Hintergrund.Ich mache ein TLS Verbindung zu einem VoIP Gateway, diese lässt sicha uch korrekt herstellen.
Wenn jetzt aber eine andere Anwendung einen Call über dieses Gateway auf meinen Client versucht, versucht das Gateway eine Verbindung mit dem Port 5061 aufzunehmen und im Wireshark sehe ich dann bei mir lokal das die Anfrage abgewiesen wird mit Destination Port unreachable.
Andere Anwendungen haben hier auch eine lokale Bindung auf dem Port 5061 unter 0.0.0.0
-
Ja, dann musst Du halt noch zusätzlich auf eingehende Verbindungen warten. (bind() + listen()). Eingehende und ausgehende Verbindungen sind 2 verschiedene paar Schuhe.
-
Ja das ist mir doch schon klar... das ich noch auf eingehende Verbindungen warten muss.
Habe mich an einer Open Source Quelle orientiert und die binden nur machen aber kein Listen.
Wenn ich nun ein Listen mach kann ich auch keinen Connect mehr machen.
-
listen() wartet auf eingehende Verbindungen. bind() und connect() nicht.
Und wenn Du mehrere Dinge gleichzeitig machen willst, nimm halt 2 Threads.
-
Oder besser: Guck dir select() an.
-
Das kann auch auf eingehende Verbindungen (nicht nur eingehende Daten) warten? Cool, wusste ich noch gar nicht. Dann ist das natürlich besser.
-
listen() wartet auf gar nix. listen() schaltet den Socket nur in den "listen-Modus" um, in dem er eingehende Verbindungen akzeptieren kann.
accept() wartet dann.Habe mich an einer Open Source Quelle orientiert und die binden nur machen aber kein Listen.
Sicher nicht, das wirst du übersehen haben.
-
hustbaer schrieb:
listen() wartet auf gar nix. listen() schaltet den Socket nur in den "listen-Modus" um, in dem er eingehende Verbindungen akzeptieren kann.
accept() wartet dann.Äh, ja. Stimmt. Danke für die Korrektur.
-
Danke für eure Mühe.
es ist allerdings nichts dabie was wirklich geholfen hat.
Auch wenn ich den Port auf INADDRY_ANY gebunden bekomme und in einem weiteren Thread abfrage. Kommt der selbe Fehler. Scheint wohl doch irgendwie am Gateway zu liegen. Mit meiner ersten Lösung funktioniert ja auch alles an einem anderen Gateway. Und auch mit diversen Softphones klappt es nicht über TLS Anrufe zu tätigen. Hab mich mal mit dem Hersteller in Verbindung gesetzt. Soll der mir sagen was die da erwarten....