Socketerstellung in eigene Funktion auslagern
-
Hi!
Ich hoffe ich bin hier richtig, denn eventuell gehört meine doofe Frage doch eher in die "C für Dummies" Rubrik. *fg* Aber da es um Linuxprogrammierung geht....
Also es geht um folgendes. Ich schreibe ein Programm, welches per RTP Daten versendet. Dazu muss ich Sockets öffnen. Und da mein Programm ca. 40 Datenströme gleichzeitig senden soll (jeweils als eigener Thread) müsste ich halt auch ebensoviele Sockets öffnen. Ich möchte aber jetzt nicht jedesmal wenn ich einen Socket öffne das ganze
struct sockaddr_in remoteServAddr;
... gethostbyname.....remoteServAddr.sin_family....cliAddr.sin_addr.s_addr...bind...usw. in eine SOCKET_open() Funktion auslagern der ich nur die Zieladresse, Quellport, Zielport übergebe. Problem ist jetzt halt das das Senden weiterhin in der Hauptfunktion stattfinden soll. Aber für sendto() brauche ich ja die Daten aus remoteServAddr und zusätzlich noch den Rückgabewert von "iSocket=socket(AF_INET, SOCK_DGRAM, 0)".
Hat jemand eine Idee wie sich das ganz einfach lösen lässt? Ich dachte schon an eine eigene Struktur in der Form
typedef struct socketparams { struct sockaddr_in sadrin; int iSocket; } SOCKETPARAMS;
und gebe dann einen Pointer auf diese struct zurück. Aber dann muss ich im Hauptprogramm das "sadrin" da irgendwie wieder raus bekommen und in eine neue sockaddr_in Struktur speichern. Wegen den 40 unabhängigen Threads kann ich ja auch schlecht eine globale Struct verwenden.
Also momentan sehe ich den Wald vor lauter Bäumen nicht mehr. Würde das gerne noch vor Weihnachten hinbekommen. Dann hätte ich diese Woche mal was geschafft.
Vielen lieben Dank für eure Tips!!
Gruß
Thorsten
-
Du könntest für jeden deiner Datenströme eine solche SOCKETPARAMS Struktur anlegen und weiterverarbeiten:
int SOCKET_open(SOCKETPARAMS* parm) {...} //im Thread: SOCKETPARAMS my_socket; int ret=SOCKET_open(&my_socket); ... send(my_socket.iSocket,...);
-
40 Threads sind aber wirklich schlecht. Benutz lieber poll/epoll, dann brauchst du nur einen.
-
Hi!
poll/epoll sagt mir jetzt spontan nichts.
Also gedacht ist halt das später von einem externen Programm über MessageQueues dynamisch neue Sendethreads erstellt bzw. beendet werden sollen. Diese sollen dann halt eine Audiodatei (individuell pro Thread) schön brav als RTP versenden. Die Pakete müssen(!) dann auch genau alle 20ms gesendet werden damit ich keinen Jitter bekomme.@CStoll: Ich glaube das probiere ich mal aus. Eventuell ist das der geringste Aufwand. Mein Problem ist halt das ich mich generell mit so Sachen wie Call By Reference und Pointer allgemein immer noch ein wenig schwer tue wenn ich nicht 100%ig ausgeschlafen bin. Und das kommt äußerst selten vor *fg*
Gruß
Thorsten