"Gebundenen" Socket (per bind()) bei Verbindung schließen und Port in anderem Prozess verwenden?
-
Ich ruf die entsprechenden Funktionen auf, um auf einem Socket abzuhören (socket(), bind(), listen(), accept()). Nachdem accept() zurückgekehrt ist (eine Verbindung da ist), schließe ich den Socket, den accept benutzt hat und möchte den entsprechenden Port, an den er gebunden war, in einem anderen Programm verwenden. Sollte doch kein Problem sein, da die Verbindung steht, der Socket geschlossen ist und er somit nicht mehr auf Clients wartet. Allerdings bekomm ich immer Fehler 98 (address in use). Windows meckert net
-
Hab auch noch ein bisschen Code, falls es dann klarer wird:
#include <iostream> #include <cstring> #include <errno.h> #include <arpa/inet.h> int sListen1 = socket(AF_INET, SOCK_STREAM, 0), sListen2 = socket(AF_INET, SOCK_STREAM, 0), sData; int doIt(int socket) { sockaddr_in si; memset(&si, 0, sizeof(sockaddr_in)); si.sin_family = AF_INET; si.sin_port = htons(60000); si.sin_addr.s_addr = INADDR_ANY; int rc = bind(socket, (sockaddr *)&si, sizeof(sockaddr_in)); if (rc != 0) { return errno; } rc = listen(socket, 5); if (rc != 0) { return 1; } sData = accept(socket, NULL, NULL); close(socket); return 0; } int main() { std::cout << doIt(sListen1); // 0 std::cout << doIt(sListen2); // 98 std::cin.get(); }
-
Wurde hier schon einmal angesprochen:
Address already in use
-
Hat leider nichts gebracht...
-
Es ist wohl zusätzlich nötig, shutdown auf den Socket aufzurufen:
::shutdown([SOCKET], SHUT_RDWR);
Dann klappts auch mit den Nachbarn...