recv: Was ist, wenn die Gegenseite nicht mehr da ist?
-
leider nicht
-
ich habs eben nochmal probiert, also wenn ich data.ptr einen wert gebe, dann wird dieser zwar auch wirklich gespeichert, allerdings wird dann bei einem aufruf von read() auf den socket immer 0 oder -1 zurückgeliefert und anscheinend wird das was gesendet wurde auch nicht ausgelesen, weil ads event zig mal pro sekunde aufgerufen wird und jedes mal wieder 0 oder -1 zurück kommt. lasse ich data.ptr einfach unverändert funktioniert alles wunderbar, d.h. bei read() wird auch alles in einem rutsch gelesen und ruhe ist.
-
und welchen wert hat errno dann?
-
es hat den wert 9, also EBADF, was hat das zu bedeuten?
-
hat jemand schon mal so diesen fehler gehabt und kann ihn mir in diesem zusammenhang erklären?
wär mir echt wichtig, weil die zeit so langsam drängt
-
du kannst ja mal nen minimal-beispiel erstellen und in eine newsgroup posten!
-
wieso antwortet hier ueberhaupt noch einer?
nach 10 seiten sollte doch klar sein, dass der herr besser mal man pages und dokumentationen lesen sollte, anstatt hier die zeit von unentgeltlich supportleistenden studenten zu beanspruchen.
-
halt du dich doch mal ganz raus. versuch du mal im internet ein einfaches beispiel oder eine man-page zu epoll zu finden, mit der man mein problem lösen kann bevor du hier große sprüche schiebst.
-
hast du denn den neusten kernel?
-
herrchen, du bist unglaublich faul.
http://www.die.net/doc/linux/man/man4/epoll.4.html
hab ich mit ein mal googlen gefunden. und jetzt schaem dich ne runde.
-
c.rackwitz schrieb:
herrchen, du bist unglaublich faul.
http://www.die.net/doc/linux/man/man4/epoll.4.html
hab ich mit ein mal googlen gefunden. und jetzt schaem dich ne runde.
man-page zu epoll zu finden, mit der man mein problem lösen kann
-
so wars bestimmt gemeint: schrieb:
man-page zu epoll zu finden, mit der man mein problem lösen kann
sollte wohl heissen
man-page zu epoll zu finden, mit der man mein problem lösen kann ohne dass ich darüber selbst nachdenken muss.
corrector
-
dann glaube ich, dass ihm keiner mehr helfen kann.
-
die seite hab ich mir schon hunderttausend mal durchgelesen und komm nicht weiter.
ich klicke auf epoll_wait, dort steht die struktur epoll_event und epoll_data (ohne erklärung der einzelnen elemente). also dachte ich, data.ptr hört sich ganz gut an, damit kann ich evt. was anfangen. also gab ich dieser variable einfach vor epoll_ctl einen wert, dieser wird auch beibehalten, allerdings kommt eben der besagte fehler EBADF mit dem ich nichts anfangen kann und ich nicht weiß, wieso er nur auftritt wenn ich data.ptr oder data.u32 oder data.u64 ändere.
und für dieses problem finde ich auf dieser seite absolut keine hilfe.
-
aber finde ich irgendwie komisch, wenn du das uninitialisiert lässt dürfte ja auch irgendwelcher mist in der ptr variable drin stehen. an deiner stelle würde ich mal ein beispiel zusammenstellen mit höchstens 20 zeilen wo man den fehler sehen kann und dann damit rumspielen!
-
ok, DAS war ich nicht. ich bin immer eingeloggt.
aber unterschreiben wuerd ich diesen post trotzdem.
basierend auf den spaerlichen fakten und meiner kristallkugel komme ich zu dem gleichen schluss.
und ich hab das gleiche beduerfnis nach code.
-
okay, hier ist ein beispielcode:
#include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> #include <sys/epoll.h> #define CLIENTS 100 #define PORT 12345 char buf[256]; int main() { int acc, client; int ep; struct sockaddr_in addr; int n, i, rc; struct epoll_event *events; char buf[256]; int counter; ep = epoll_create(100); events = (struct epoll_event *)malloc(sizeof(*events) * CLIENTS); acc = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = INADDR_ANY; bind(acc, (struct sockaddr *)&addr, sizeof(addr)); listen(acc, 10); events->events = EPOLLIN; events->data.fd = acc; epoll_ctl(ep, EPOLL_CTL_ADD, acc, events); counter = 0; while (1) { n = epoll_wait(ep, events, CLIENTS, -1); for (i=0; i<n; i++) { if (events[i].data.fd == acc) { printf("Accept...\n"); client = accept(acc, 0, 0); events->events = EPOLLIN; events->data.fd = client; events->data.ptr = counter; // Wenn ich diese Zeile auskommentiere kommt kein Fehler. epoll_ctl(ep, EPOLL_CTL_ADD, client, events); counter++; } else { memset(buf, 0, 256); rc = read(events[i].data.fd, buf, 255); printf("-%d-\n\n", events[i].data.ptr); if (rc <= 0) { printf("Closed. Fehlercode: %d\n", errno); epoll_ctl(ep, EPOLL_CTL_DEL, events[i].data.fd, events); close(events[i].data.fd); } } } } return 0; }
Es wird eben einfach nur ein Socket erstellt, der auf den Port 12345 lauscht und in der Hauptschleife wird gewartet bis ein neuer Socket angenommen werden kann, welcher dann durch events->data.ptr eine von mir definierte variable counter erhält. Wenn Daten eintreffen wird mitunter dieser Wert ausgegeben.
Allerdings tritt, wenn ich die bekennzeichnete zeile nicht auskommentiere, immer ein Fehler mit der Nummer 9 auf.
Ich hoffe ihr könnt mir helfen.
MfG
-
und wenn du u32 statt ptr verwendest?
-
Rückgabewert von accept() prüfen?
-
vielleicht ist es eine union? *wildspekulier*