recv: Was ist, wenn die Gegenseite nicht mehr da ist?
-
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*
-
c.rackwitz schrieb:
vielleicht ist es eine union? *wildspekulier*
-
c.rackwitz schrieb:
vielleicht ist es eine union? *wildspekulier*
kannst du das genauer erklären? versteh ich grad nicht ganz, was soll eine union sein?
-
steht in jedem c buch.
-
sorry, ich meinte auf was er sich mit "vielleicht ist es eine union?" bezieht
edit: okay, habs jetzt verstanden. Ja dann kann ich ja gar nichts mehr ändern, weil data.fd immer gesetzt ist, oder?
-
kann man ja eine eigene struktur anlegen die den deskriptor und die eigentlichen daten enhält.
-
Aber epoll greift doch intern auch auf data.fd zu, oder? D.h. der wert von data.fd muss auch immer "an der gleichen stelle" in der epoll_event struktur sein, oder?
-
Keine Ahnung, aber wenn das so wäre dann wüsste ich nicht was der Sinn dieser Union sein sollte.
-
und hat jetzt irgend jemand nen tipp was ich da machen könnte?
-
ausprobieren?
-
@herr...: fuer anwendungsentwicklung hast du offenbar kein talent. konzentrier dich lieber auf webdesign. deine webseite hast du ja ziemlich gut aussehen lassen.
-
joa schon möglich, ich merk mirs für die zukunft ^^
allerdings muss ich trotzdem das problem jetzt lösen und ich muss eine methode finden, sowohl den filedescriptor als auch eine id in das union zu packen. Da der größte datentyp 8 Byte groß ist (uint64_t u64) muss es doch möglich sein, in 4 Bytes die ID und in die anderen 4 den Filedescriptor zu packen, oder?
-
was zum geier hindert dich, das auszuprobieren oder einfach mal rauszufinden?
ich wette, du hast irgendeinen programmierauftrag angenommen und jetzt bist du geliefert, weil du es nicht hinkriegst...
-
dieser thread hat unsägliche dimensionen angenommen, eigentlich könnte man ihn schliessen.