TCP /IP
-
select()
-
net schrieb:
individuum schrieb:
100Mbit/s -> 12,5MByte/s
nee, aber nicht wirklich

diese 100 Mbits/s sind wirklich der absolute maximalwert, mit dem die bits durch's medium schwirren können (bei ethernet 100BaseT z.b. sind's 125µS zwischen zwei clock pulsen). die nutzdatenrate liegt bei ethernet durch protokolloverhead, kollisionen, latenzzeiten der hardware, etc. deutlich niedriger. beispiel: wenn du von einem 10Mbit/s ethernet auf ein 100Mbit/s ethernet wechselst, haste keine 10fach höhere nutzdatenrate (wie man annehmen sollte), sondern nur etwa eine 2 bis 2.5 fache!
dazu kommen noch die schlimmsten bremsen: software - (anwendung, tcp/ip, treiber etc.) und schon ist die nutzdatenrate im keller...net, das stimmt so net

Ich hab selbst schon über ein 100mbit Netz >7mb/sec drübergedrückt - das ist kein Problem. Solange man nicht viel Kollisionen hat -- bloss die bremsen ein 10mbit Netz genauso.
Sogar aus meinem 1000mbit Netz bekomm ich mehr als 25mb/sec raus (nämlich ca. 40mb/sec), und das ohne Server Netzwerkkarten (mit Server Netzwerkkarten kommt man schon auf > 60mb/sec).
-
hustbaer schrieb:
net, das stimmt so net

Ich hab selbst schon über ein 100mbit Netz >7mb/sec drübergedrückt...tjä, ausnahmen bestätigen die regel. was ich da geschrieben hab' stammt von 'nem vergleich windoofs <--> selbstgebastelter hardware, 100mbits ethernet, tcp/ip loopback in einem kleinem netzwerk (1 switch, etwa 5 teilnehmer dran), paketgrössen zwischen etwa 600 und 1460 bytes.
windows(xp) <--> windows(xp) war sogar ein tickchen langsamer (etwa 2MB/s).btw: was sind server netzwerkkarten?
-
nett schrieb:
select()
da find ich nicht recht was zu..
also ich möchte eine automatische reconncet funktion erstellen:
wie kann man das unterbinden das er bei Socket.listen() eweig wartet?
-
net schrieb:
btw: was sind server netzwerkkarten?
Das sind welche wo "Server" draufsteht

Die sind dann teurer als "normale", aber eben schneller. Im Prinzip einfach bessere Karten, und meist mit PCI-X oder neuerdings PCIe Anbindung.Die haben dann auch bessere Treiber, erledigen diverse Aufgaben auf der Karte (teile des TCP/IP Stacks), und können über Busmaster selbst diverse "Auftragslisten" aus dem RAM holen und abarbeiten -- so dass die CPU nichtmehr für jedes einzelne blöde Packet nen PCI Zugriff machen muss.
Im Endeffekt haste mit einer guten Server Netzwerkkarte kaum CPU Auslastung während das Teil jenseits der 60MB/sec über 1000Base-T raushaut.
----
Klar kann man auch einfach "gute Netzwerkkarte" dazu sagen, bloss Intel z.B. verwendet den Begriff selbst ("Intel PRO/1000 MT Server Adapter"), und kaum ein Heimanwender kauft sich so eine teure Karte, von daher finde ich es nicht verkehrt einfach "Server Netzwerkkarte" zu sagen -- so wie man ja auch "Server Platte" sagt etc.
-
hustbaer schrieb:
Die haben dann auch bessere Treiber, erledigen diverse Aufgaben auf der Karte (teile des TCP/IP Stacks), und können über Busmaster selbst diverse "Auftragslisten" aus dem RAM holen und abarbeiten -- so dass die CPU nichtmehr für jedes einzelne blöde Packet nen PCI Zugriff machen muss.
wow, find ich interessant. wo krieg ich infos darüber?
-
Hier steht ganz wenig zu "was", aber nicht zu "wie":
http://www.intel.com/network/connectivity/resources/doc_library/data_sheets/pro1000mt_sa_dual.pdfAnsonsten... keine Ahnung

Ich hab das mal auf der NTDEV Mailing Liste von OSR (www.osronline.com) aufgeschnappt (is ne offene Sache, kannst dich ja mal eintragen wenn dich Treiber Entwicklung und so interessiert - gute Leute dort). Da hat auch einer vorgerechnet dass man ne gigabit Karte die in einem normalen PCI Slot steckt sowieso nichtmehr ausreizen kann wenn die CPU für jedes Paket ("Frame" oder wie das im Ethernet Fachjargon heisst) extra ran muss um die Karte anzusprechen. Leider kenn ich mich mit DMA bei PCI Karten und generell PCI Zugriffen nicht so aus -- ich vermute aber dass ein PCI Zugriff per CPU auf ein einzelnes Register wesentlich mehr als einen PCI Zyklus dauert.
Is auch irgendwie logisch dass bessere Netzwerkkarten sowas können sollten. Macht wenig Sinn z.B. für jedes empfangene Paket nen Interrupt zu generieren und die liebe CPU zu bitten ne neue Adresse im Speicher für das nächste Paket bereitzustellen bzw. die alten Daten aus dem DMA Bereich rauszukopieren. Ist doch viel besser wenn man der Karte sagt "da haste 10MB Speicher, geh spiel damit wie du meinst, und wenn du nen paar Pakete reinbekommen hast, oder eines und dann nen paar nanosekunden nixmehr, dann mach mir nen Interrupt". Salopp gesagt

-
hustbaer schrieb:
Ist doch viel besser wenn man der Karte sagt "da haste 10MB Speicher, geh spiel damit wie du meinst, und wenn du nen paar Pakete reinbekommen hast, oder eines und dann nen paar nanosekunden nixmehr, dann mach mir nen Interrupt"
klar, was anderes ist bei nic's >100mbits/s wohl auch nicht sinnvoll

wobei ich mal gehört habe, dass die ix86-kisten pci-dma nur sehr unzureichend unterstützen (busmaster kann keine virtuellen adressen benutzen, es können keine dma-aktionen zusammengefasst werden, keine scatter listen etc.). naja, aber als verkaufsargument ist ja sowas trotzdem gut.... :xmas2:
-
hallo,
kann es sein das es Select bei CSocket nicht gibt?
wieso benutz ich überhaupt csockets?hat sich erledigt.. manchmal sieht man den wald vor lauter bäumen nicht!

-
tja.. ich werd noch verrückt..
int CEmpfaengerDlg::fkttesthoch3(int port)
{
int ok;
CSocket m_sMySocket;
CSocket clients[MAX_CLIENTS];
FD_SET fd;
FD_ZERO (&fd);
TIMEVAL tv;for(int i=0;i<MAX_CLIENTS;i++)
{FD_SET(clients[i],&fd); //füllt fd mit sockets
}if (ok=m_sMySocket.Create(port)){};
if ((ok)&&(ok=m_sMySocket.Listen())){};
tv.tv_sec=10;
ok=select(0, &fd,NULL, NULL, &tv);
machwas.InsertString(0,"nach select");if(ok==1){
ok=m_sMySocket.Accept(clients[1]);}
return ok;
}müßte er bei der funktion selcet jetzt nicht eigentlich blockieren und 10 sekunden auf einkommende verbindungen warten?!
er springt aber so über select rüber und gibt eine -1 zurück...
was mach ich falsch?
-
@individuum:
Du füllst "fd" mit lauter "sockets" an die es noch garnicht gibt - da wird also wahrscheinlich INVALID_SOCKET drinstehen.Ausserdem musst du wenn du auf eingehende Verbindungen warten willst ein select() auf den "listen socket" machen, und die Verbindung dann mit accept() annehmen.
Und keine Ahnung wieso du "CSocket" verwendest, ich hab mir immer nen eigenen Wrapper geschrieben...

@net:
wobei ich mal gehört habe, dass die ix86-kisten pci-dma nur sehr unzureichend unterstützen (busmaster kann keine virtuellen adressen benutzen, es können keine dma-aktionen zusammengefasst werden, keine scatter listen etc.).
* busmaster kann keine virtuellen adressen benutzen
-> jo, muss aber auch nicht, muss der Treiber halt genug Speicher "am Stück" für die Karte reservieren - geht ja übers OS normalerweise* es können keine dma-aktionen zusammengefasst werden, keine scatter listen etc.
-> wenn die Karte "busmaster" kann sollte sie das eigentlich können. Sollte heisst ich weiss es nicht, denke aber es müsste gehen
-
ok, das select klappt jetzt. danke hustbaer