MatzeT Geschrieben 13. April 2002 Geschrieben 13. April 2002 Hi, ich versende und empfange Daten über einen Socket. Dazu verwende ich die Funktionen send() und recv() in Visual C++. Beim Senden ist alles ok. Nur beim Empfangen "wartet sich der Server tot", weil er keinen Timeout bekommt. Weiss jemand, wo ich ihm einen Timeout setzen oder einstellen kann???? Zitieren
Klotzkopp Geschrieben 13. April 2002 Geschrieben 13. April 2002 Die normale Socket-API stellt keine Möglichkeit zur Verfügung, Timeouts festzulegen. Man kann sich aber z.B. mit einem weiteren Thread behelfen, der nach einer bestimmten Zeit den Socket schließt, so dass send bzw. revc mit einem Fehler zurückkommt. Es gibt auch jede Menge plattformspezifischer Lösungen, z.B. für MFC: http://fachinformatiker-world.de/forums/showthread.php?s=&threadid=19704 Zitieren
nic_power Geschrieben 13. April 2002 Geschrieben 13. April 2002 Da gibts zwei klassische Methoden (ich bin mir aber nicht sicher ob auch beide unter Windows laufen). Du setzt den Empfangssocket mit fcntl(2) auf "nonblocking", dann kehrt recv immer zurueck (mit dem return-Wert -1 und errno auf EAGAIN wenn keine Daten vorhanden sind). Die zweite Methode (ein select-loop) sollte auch unter Windows laufen. Du klapperst Deine Sockets mit select(2) ab, um zu ueberpruefen, ob Daten vorhanden sind. Bei select kannst Du auch einen Timeout mit angeben. Ein einfaches Beispiel habe ich nicht zur Hand, aber schau Dir doch mal die folgenden Seiten an: http://www.erlenstar.demon.co.uk/unix/faq_3.html#SEC26 http://www.lowtek.com/sockets/select.html Nic PS: Select gehoert zur socket-API und sollte daher auch unter Windows vorhanden sein. Zitieren
Klotzkopp Geschrieben 13. April 2002 Geschrieben 13. April 2002 Original geschrieben von nic_power Select gehoert zur socket-API und sollte daher auch unter Windows vorhanden sein. Ist es. An select hatte ich gar nicht mehr gedacht. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.