Hallo,
eine bestehende C Applikation soll dahingend erweitert werden, dass mit
eine Applikation mehrere Clients erzeugt und diese jeweils UDP
Nachrichten versenden und empfangen können.
Die vorhandene C Applikation benutzt einen Thread in dem die ankommenden
Daten empfangen und weitergereicht werden. Was müsste ich tun, damit ich
mehrere Client mit einer C Anwendung verwalten kann?
Ich habe schon einiges getestet sogar mit der select Funktion leider
ohne Erfolg. Wenn ich zum Beispiel die select Funktion benutze läuft das
Programm nicht weiter.
Dann machst Du irgendeinen grundsätzlichen Fehler bei der Verwendung von
select(). Hast Du Dir denn wenigstens die Unmengen an Diskussionen bei
Stackoverflow zu dem Thema select() mit UDP angeschaut, aufmerksam
durchgelesen UND verstanden?
user schrieb:> Ich habe schon einiges getestet sogar mit der select Funktion leider> ohne Erfolg. Wenn ich zum Beispiel die select Funktion benutze läuft das> Programm nicht weiter.
Es blockiert in select() solange, bis ein datagram eintrifft bzw. man
kann es
so parametrieren.
user schrieb:> Hallo,>> eine bestehende C Applikation soll dahingend erweitert werden, dass mit> eine Applikation mehrere Clients erzeugt und diese jeweils UDP> Nachrichten versenden und empfangen können.> Die vorhandene C Applikation benutzt einen Thread in dem die ankommenden> Daten empfangen und weitergereicht werden. Was müsste ich tun, damit ich> mehrere Client mit einer C Anwendung verwalten kann?
Warum nicht ein paar threads pre-create-en (vorher erzeugen) und die
alle in recvfrom() blockieren lassen. Einer bekommt das datagramm und
läuft weiter.
Natürlich ist ein bißchen Buchführung notwendig, um immer genug threads
zu haben ...
user schrieb:> Das mit einem Thread wie funktioniert dies?
POSIX oder Win-API?
Bei POSIX: schau Dir die pthread_... systemcalls an.
Allerdings sehe ich an Deiner Antwort, dass das Thema Nebenläufigkeit
für Dich wohl Neuland ist. Vielleicht nimmst Du erst mal ein Buch zur
Hand.
Wozu überhaupt select() oder mehrere Threads? Es ist doch UDP. Da kann
doch doch eh der eine Socket die Daten von allen Clients empfangen, so
lange sie an den selben Port senden.
Meine derzeitge Applikation sieht so aus, dass ich für jeden Teilnehmer
die bind Funktion ausführe und nur einen Thread starte. Im Thread wird
dann die Funktion recvfrom zum Empfangen von Daten benutzt. Allerdings
funktioniert dies nicht so wie es sein sollte. Der Empfang funktioniert
nicht korrekt.
Rolf M. schrieb:> Wozu überhaupt select() oder mehrere Threads? Es ist doch UDP. Da kann> doch doch eh der eine Socket die Daten von allen Clients empfangen, so> lange sie an den selben Port senden.
Naja, der eine Thread könnte recht lange brauchen, um die Antwort
zusammen zu stellen, dann kann er nicht wieder zu einem recvfrom()
zurückkehren.
Und mit select() kann man schauen, ob ein nachflgender syscall
blockieren würde. Das liefert eine Multiplexlösung ... braucht man bei
pre-threading nicht.
Hier wurden nun einige Vorschläge gemacht. Fakt ist das meine Anwendung
mit nur einem Thread nicht funktioniert. Wie würde das ganze dann mit
einem Thread und zusätzlich der select Funktion aussehen?
user schrieb:> Hier wurden nun einige Vorschläge gemacht. Fakt ist das meine Anwendung> mit nur einem Thread nicht funktioniert. Wie würde das ganze dann mit> einem Thread und zusätzlich der select Funktion aussehen?
Woher sollen wir das wissen??? Dann zeige doch erst mal Deinen Code!!!
user schrieb:> Fakt ist das meine Anwendung> mit nur einem Thread nicht funktioniert.
Fakt ist, das select bei viele Anwendungen funktioniert - also wird der
Fehler bei dir legen.
> Wie würde das ganze dann mit> einem Thread und zusätzlich der select Funktion aussehen?
mal schnell etwas mit Threads machen, ist eine sehr schlechte Idee. Da
muss man sich schon ein paar Gedanken über Synchronisation und
Kommunikation der Threads machen.
Dafür müsste aber wissen was genau das Programm machen soll.
user schrieb:> Für das Empfangen von UDP Nachrichten wird ein Thread benutzt.> Die Empfangsfunktion kann dann außerhalb von diesem Object aufgerufen> werden.
kannst du jetzt noch mal genau schreiben, was passiert bzw. wo das
Problem liegt.
Du hattest ja geschrieben, das select blockiert, aber du hast du einen
timeout von 1 sekunde - länger dürfte es nicht blockieren.
Die Funktion select blockiert nun nicht mehr mein Programm.
Die Funktion objectUDPPort_Receive und die Thread Funktion UDPThread
befinden sich innerhalb vom Objekt objectUDPPort.
user schrieb:> Ich hab im Netz recherchiert.
Oh Mann, WAS hast Du denn geändert, dass es nun geht? Lass uns teilhaben
... jedenfalls die, die Dir helfen wollten.
user schrieb:> Im Prinzip habe ich die Thread Funktion mit der select Funktion> erweitert.
Das select() (mit timeout) war vorher auch schon drin ... aber lt.
Deiner Aussage ohne Erfolg. Als was war es ?
user schrieb:> Ich hab im Netz recherchiert.
Aha. Stammen die obigen Quellcodeabschnitte denn auch "aus dem Netz"?
Unter welchen Lizenzbedingungen darfst Du sie denn verwenden? Bei den
meisten Open-Source-Lizenzen werden doch die Nennung des Urhebers und
der Lizenzbedingungen selbst verlangt.
Oder hast Du etwa eine juristisch durchaus relevante
Urheberrechtsverletzung begangen?
Der Andere schrieb:> Auf Deutsch: solange irgendwelche Codeschnipsel aus dem Netz> zusammengebastelt bis es anscheinend funktioniert.
Solch einen Typen hatte ich auch einmal eingestellt, der völlig wahlfrei
irgendwelche Codeschnipsel aneinanderreihte und dem noch nicht einmal
bewusst war, dass man diese Teile zumindest über Funktionsaufrufe,
Datenstrukturen o.ä. miteinander verbinden musste. Und derjenige war
sogar Diplom-Informatiker, frisch von der FH! Kurze Zeit später war er
wieder arbeitslos, fand aber schnell einen weiteren Job, aus dem er
sogar noch schneller wieder hochkant herausflog. Der Typ hatte wirklich
keinerlei Vorstellungen davon, was er überhaupt falsch machte.