TCP - Server - Sockets
-
Hallo Leute,
soweit ich das verstehe:
auf Server Seite gibt es zwei Sockets einmal den Socket der auf dem Port listen() tut und dann den Socket über welchen die Verbindung läuft.FD_ZERO(&fdSet); // Inhalt leeren FD_SET(MasterSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen select(0,&fdSet,NULL,NULL,&time); if(FD_ISSET(MasterSocket,&fdSet)) { for(i=0;i<MAX_CLIENTS;i++) { if(ClientSocket[i]==INVALID_SOCKET) { ClientSocket[i]=accept(MasterSocket,NULL,NULL); Streamer[i]= new CStreamer(ClientSocket[i]); // our streamer for UDP/TCP based RTP transport RtspSession[i]= new CRtspSession(ClientSocket[i],*(Streamer+i)); printf("Neuen Client angenommen (%d)\n",i); flag = true; break; } } }Das ist mein Code der irgendwie nur teilweise funktioniert.
Dh. der Client frägt den Server an einem Port+IP an. Der Server accepted() und übergibt den Socket (hier ClientSocket) weiter also an den Socket über welchen die Verbindung laufen soll. In meinem Fall soll der Mastersocket() auf weitere Verbindungen durch select() warten.
So und nun zu meiner Frage. Ich habe den Client nicht programmiert weil es der VLC Player ist, ich habe das Problem, dass ich nach kurzer Zeit ein neuer Socket bei mir auf Serverseite angelegt wird so als ob die Gegenseite wieder connect() aufruft. Kann das sein? Oder in welchem Fall würde select() noch reagieren?
Ich habe das RTP/RTSP Protkoll implementiert und würde gerne das sich mehr als 1 Client auf meinen Server zugreifen kann. Das Problem ist das ich das ich nach kurzer Zeit des Streams plötzlich ein neuer Clientsocket der alles kaput macht.
Libs, std etz funktioniert nicht weil für eine Kamera die ein eigenes OS hat.
Gruß
-
Es könnte sein, dass sich der Server nach Annahme einer Verbindung nicht vorschriftsgemäss verhält und deshalb der Client die Verbindung wieder trennt und erneut versucht zu verbinden.
Was nun vorschriftsgemäss bedeutet, hängt vom Protokoll ab - so könnte es z.B. sein, dass Anfragen vom Client zu lange unbeantwortet sind oder schlicht und einfach eine falsche Antwort zum Client gesendet wird.
Um einen allfälligen Fehler zu finden, würde ich mit Wireshark den Netzwerkverkehr analysieren, AFAIK wird da RTP/RTSP erkannt und decodiert. Natürlich könntest du auch die empfangenen- und gesendeten Daten selbst loggen.
Was mir auf den ersten Blick etwas komisch vorkommt, ist dass sowohl
CStreamerals auchCRtspSessionden gleichen Socket übergeben bekommen (ClientSocket[i]) - ev. hilft es hier, den entsprechenden Code zu zeigen.
-
Hi danke für die Antwort!
Naja der gesamte Code ist von mir und funktioniert auch (keine Libs wirklich alles), aber halt nur mit einem Client. Wollte das jetzt auf mehr als einen umschreiben.
Ich übergebe den gleichen Socket weil ich einmal die Kommunikation für RTSP über TCP mache und einmal über UDP die RTP Packete rausschicke. Aber das nur am Rande. Weil das ganze eig. schon längst funktioniert.
Ich wollt eig. nur wissen ob die obere Struktur "allgemein" richtig ist und man diese auch so verwenden kann. Weil hatte das ganze bisher ohne select().
Gruß
-
Bomporom schrieb:
Hi danke für die Antwort!
Naja der gesamte Code ist von mir und funktioniert auch (keine Libs wirklich alles), aber halt nur mit einem Client. Wollte das jetzt auf mehr als einen umschreiben.
Ich übergebe den gleichen Socket weil ich einmal die Kommunikation für RTSP über TCP mache und einmal über UDP die RTP Packete rausschicke. Aber das nur am Rande. Weil das ganze eig. schon längst funktioniert.
Ich wollt eig. nur wissen ob die obere Struktur "allgemein" richtig ist und man diese auch so verwenden kann. Weil hatte das ganze bisher ohne select().
Gruß
Dein select ist falsch. funktioniert so nur unter windows.
Mfg martin
-
Ja ist in dem Fall zuerst unter Windows umgesetzt die selet() fkt. sieht auf dem OS etwas anders aus, da das flashen extrem umständlich ist habe ich es zuerst unter windows programmiert.
-
Bomporom schrieb:
Ja ist in dem Fall zuerst unter Windows umgesetzt die selet() fkt. sieht auf dem OS etwas anders aus, da das flashen extrem umständlich ist habe ich es zuerst unter windows programmiert.
Normalerweise übergibt man im ersten Parameter das größte handle +1. Windows ignoriert den Wert, kannste also auch machen.
select ( mastersocket +1, ...);Mfg Martin