TCP-Socket - (Verständnis-)Frage
-
Hallo zusammen!
Ich bin gerade am erweitern eines bestehenden C++ - Programmes und habe nun eine Verständnisfrage bezüglich Sockets.
Zum Hintergrund: das zu erweiternde Programm verbindet sich bisher immer mit einer IP-Adresse (wahlweise v6 oder v4, TCP oder UDP) und schickt mit einer sehr hohen Frequenz Request an den Gegenpart ab, und empfängt die Responses.
Nun muß ich das so erweitern, daß ich nicht nur mit einem Server kommuniziere, sondern mit mehreren (die Adressen wären dann im Array "Adresse[n]").
Nun die (wahrscheinlich blöde) Frage: kann man dazu die Option "SO_REUSEADDR" verwenden?
Also die Schritte (brutal zusammengestückelt)socket_fd=socket(....); setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR,...); for(int j=0;j<1000;j++){ for(int i=0;i<100;i++){ connect(socket_fd,Adresse[i],...); send(...); i++ } //und nun die Antworten for(int i=0;i<100;i++){ c=accept(socket_fd,...); bytes=recv(c,...); dosomethingwithbytes(bytes); } } close(socket_fd);
Liege ich da komplett falsch? Hat das Sinn? Wie könnte ich das sonst lösen (Fragen über Fragen)
Merci
Mitsch
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
die option SO_REUSEADDR wird nur benötigt wenn du auf einem Port in listen-modus gehen willst, der noch fehlerhafterweise belegt ist... zB wenn dein Programm abgestützt ist ohne den Port wieder freizugeben.
mfg blan
-
Oh!
Und wenn ich nun, wie oben angedeutet, über einen Socket (und TCP) an mehrere Hosts in kurzer Folge Daten senden möchte, geht das so, oder wie gehe ich das an? kann ich jedesmal einen Connect auf den selben Descriptor machen, oder ist da was zu beachten,
lg
Mitsch
-
sendest du mit TCP oder UDP?
und sind das jeweils client / server oder wirklich ein client und server in einem wie im code?
mfg blan
-
Wahlweise TCP oder UDP. UDP ist leichter, da mache ich ein verbindungsloses sendto(), nur bei TCP hänge ich.
Das Prinzip dahinter ist ein Handshake, in etwa so:localhost Addresse[i] |(1) INVITE | |----------------- >| |(2) 200 | |< -----------------|
lg
Mitsch
-
ich verstehs net ganz - dein code schickt und empfängt 100.000 nachrichten - was solln des bringen..?
naja fürs einfache hintereinader connecten kannst einfach sowas machen (TCP):
if((connect(...) != SOCKET_ERROR)) { send(...) } close(socket);
und den code halt immer wiederholen - wobei sowas egtl absoluter schwachsinn ist, wozu bracuhst du sowas. bzw was willst damit machen?
mfg blan
-
Ist ein Brute-Force Testtool, welches in kurzer Zeit sehr viele VoIP-Verbindungen aufbauen und abarbeiten muß (das bestehende, das ich eben erweitern muß, habe ich schon auf 5000 Anrufe/Sec gebracht).
Die Frage auf Dein Snipplet: Es genügt also, ein Connect pro Verbindung zu machen, und nicht auch danach jedesmal zu closen, sondern erst ganz zum Schluß?
-
öhm? dann bleibt die verbindung halt offen bis es zunem timeout kommt - aber das willst du ja nicht oder?
mfg blan
-
Sorry, habe mich verschaut, ich las eine Schleifendefinition, sitze heute schon viel zu lange vor dem Schmarren ...
Also, ich rekapituliere: Bei TCP muß ich, wenn ich an verschiedene IP-Adressen Requests schicken möchte, immmer
connect(socket,host,...) send(...) close(socket)
machen?
Mitsch
PS: das Tool heisst SIPp, sipp.sourceforge.net
-
Mitsch schrieb:
Also, ich rekapituliere: Bei TCP muß ich, wenn ich an verschiedene IP-Adressen Requests schicken möchte, immmer
connect(socket,host,...) send(...) close(socket)
machen?
ja sodass die verbindung aufgebaut wird, daten gesendet werden und dann zum schluss die verbindung wieder geschlossen wird.
mfg blan
-
OK, nun ist das Problem zumindest ein wenig klarer
Merci