.| Autor | Beitrag |
|---|---|
|
000 12.04.2007, 17:46 Felheart |
Hi, Also ich habe einen Server und einen Clienten. Wenn ich jetzt aber einen verbindungsabbruch simmuliere indem ich einfach den Ich muss beide Programme neustarten das alles wieder normal geht. Ich hab schon überall printf's und Sleep's eingebaut um zu sehen ob und wo Aber alles ohne erfolg! -- |
|
Profil || Suche |
|
001 12.04.2007, 20:51 Cpt. Rick |
Ich weiß nicht genau wo dein Error liegt (ein bischen code wäre vllt ganz hilfreich). |
|
Profil || Suche |
|
002 15.04.2007, 17:57 Felheart |
Ok, hier ein DL link zu den Sources: Inzwischen ist zwar ein chat programm daraus geworden aber das problem ausserdem ist jetzt noch dazugekommen das der client die ganze zeit |
|
Profil || Suche |
|
003 15.04.2007, 20:26 feigling |
Das Problem kenne ich. Das liegt dadran, dass select() fehlschlägt, weil die Verbindung abgebrochen ist und damit die CPU zu 100% belastet wird, weil eben die Hauptschleife immer durchläuft und select() nicht mehr "blockiert" bzw die angegebene Zeit wartet. So ganz habe ich auch noch nicht rausgefunden, wie man das fixen kann. Mein Code sieht im Moment so aus (weiter unten), aber ich bin mir nicht wirklich sicher, ob ich das damals gefixt hatte oder nicht. So wie mein Code aussieht, würde ich eher vermuten, dass es nicht gefixt ist, aber ka.
Dieser Beitrag wurde am 15.04.2007 um 20:28 von feigling bearbeitet. |
|
Profil || Suche |
|
004 16.04.2007, 14:16 Felheart |
select() ? ich hab zwar schon sehr oft von dieser funktion gehört / gelesen, Wenn du dir den beigelegeten code anschaust siehst du das ich Ist es den ratsamer mit select seine clients auszuwählen ? Btw: dabei noch ne frage zu recv(): wenn ein socket etwas via recv empfängt und die das dann "lange" bearbeitet und wenn der client ind diesen 3 sekunden nochmals etwas sendet, |
|
Profil || Suche |
|
005 16.04.2007, 15:47 HammerBlade |
Bist du sicher das recv() WSA Errorcodes zurückgibt? Ich denke WSARecv() wird das hächstens tun. recv() wird seine Errorcodes in errno ablegen (da bin ich aber gerade unsicher drüber). Bis du sicher, dass der Zugriff von printf auf stdout threadsafe ist? Wenn das nicht der Fall ist (was ich annehme, aber nicht sicher weiss) kann es passieren, dass Client A "aaaaaa" sendet und Client B "bbbbbb" sendet, das dann aber auf der Console nicht als "aaaaaa\nbbbbbb\n", sondern als "aaabbbaaa\nbbb\n" ankommt. Je nachdem wie die Thread gerade gescheduled werden. Soll heissen du solltest das vielleicht mit einem Mutex (bzw. auf Windows einer CriticalSection) schützen. Sockets haben Eingangs- und Ausgangsbuffer einer bestimmten Grösse, welche Schwankungen auffangen können, d.h. bei dem geringen Datenaufkommen eines Chats wirst du auch mit 3sec Bearbeitungszeit keine Probleme haben. -- "Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 16.04.2007 um 15:48 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
006 16.04.2007, 17:06 Felheart |
Ok, stimmt. " || ERR == WSAECONNRESET || ERR == WSAECONNABORTED" == quatsch :D Werd mich informieren, das wird aufjedenfall gemacht (Und ja das mit dem aabaabbb ist schon passiert.) Aso, thx -- Dieser Beitrag wurde am 16.04.2007 um 17:07 von Felheart bearbeitet. |
|
Profil || Suche |
|
007 16.04.2007, 19:10 feigling |
Ja, select ist besser als Threads oder du kannst auch epoll benutzen (#include <sys/epoll.h>) falls das dein Server unterstützt. Übrigens sind Variablennamen in Großbuchstaben böse. Nur defines sollten vollständig caps sein. Und received schreibt man mit nem "e" und ned recived += ERR; ;x -- |
|
Profil || Suche |

