Hi,
ich muss gerade in C herausfinden, ob eine IP Kamera (POE versorgt, hängt sich manchmal auf) noch funktioniert. Dazu würde ich gerne in C prüfen, ob der Port (im Beispiel unten 9999) offen / erreichbar ist. Prinzipiell funktioniert das mit dem folgenden Code und ich erkenne zuverlässig den offenen Port, jedoch verursache ich dadurch auf der Gegenseite offene Verbindungen, bis diese in den Timeout laufen (testweise läuft gerade lokal ein VLC und stellt einen Dummystream auf dem Port bereit). Gibt es keine Möglichkeit, das ich die von mir initiierte Verbindung nachhaltig beenden kann?
Hier der Code-Schnipsel:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd>= 0) {
server = gethostbyname(IP_VLC);
if (server != NULL) {
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *) &serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(PORT_VLC);
if (connect(sockfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr))<0) {
logger(LOG_ERR, "port is not reachable\n");
// do something
}
}
close(sockfd);
}
Alles anzeigen
Ich dachte mit close(sockfd) beende ich auch die offenen Verbindungen. Leider sieht das in netstat anders aus:
tcp 0 0 192.168.0.21:9999 0.0.0.0:* LISTEN
tcp 0 0 192.168.0.21:35192 192.168.250.21:9999 TIME_WAIT
tcp 0 0 192.168.0.21:55794 192.168.250.21:9999 TIME_WAIT
Gefühlt verschwinden die offenen Verbindungen (TIME_WAIT) nach ca. 60s (vermutlich das Standard-Timeout).
Hat hier jemand einen Hinweis, wie ich die Verbindung nachhaltig schliessen kann? Über bash und netstat könnte ich es auch machen, jedoch läuft schon eine andere Logik in C un würde das gerne in einem Aufwasch erledigen.
Danke schonmal im Voraus...