recv: Was ist, wenn die Gegenseite nicht mehr da ist?



  • ja da gibts ja aber nix zu epoll, das einzige was ich finden konnte war diese seite, die die ganze sache aber auch nicht viel besser erklärt:
    http://www.die.net/doc/linux/man/man4/epoll.4.html

    ich hab jetzt schon mal folgenden code(ausschnitt):

    ...
    	counter = 0;
    
    	while (1)
    	{
    		n = epoll_wait(ep, events, CLIENTS, -1);
    
    		for (i=0; i<n; i++)
    		{
    			if (events[i].data.fd == acc)
    			{
    				clients = accept(acc, 0, 0);
    
    				events->events = EPOLLIN;
    				events->data.fd = client;
    
    				epoll_ctl(ep, EPOLL_CTL_ADD, client, events);
    
    				counter++;
    			}
    ...
    

    acc ist dabei ein socket im listen-modus.

    nun möchte ich, dass der Socket, der bei accept angenommen wird, auch irgendwie mit dem Wert von counter identifiziert werden kann, d.h. irgendwo in der event struktur soll der wert von counter gespeichert werden, aber ich hab keine Ahnung wie das funktionieren soll.
    Ich hab auch einfach mal testweise events->data.u32 = counter gemacht, aber dann kommen gar keine nachrichten mehr an...

    MfG, Herr-Vorragend



  • Hm, ich hab festgestellt, dass der erste angenommene Socket die ID 6 hat, der zweite 7, der dritte 8 usw.

    kann ich mich darauf verlassen, dass der Zähler mit 6 beginnt und dann einfach ein "anzahl_maximale_clients+6" großes Array erstellen?



  • Wenn es irgendwo dokumentiert ist, ja. Sonst nein.



  • Ja weiß irgendjemand wie ich es sonst machen könnte? Ich muss eben jedem angenommenen Socket eine eindeutige ID geben, der erste bekommt 0, der zweite 1 usw., damit ich diese später einfach als Indizes für ein Array benutzen kann...



  • okay, ihr wollt also nicht mit mir reden ^^

    kann ich denn zumindest davon ausgehen, dass die socket-ids hochgezählt werden?
    Dann würde ich nämlich

    index = socket_id - socket_id_des_ersten_angenommenen_sockets

    setzen.

    Mfg



  • Herr-Vorragend schrieb:

    Ja weiß irgendjemand wie ich es sonst machen könnte? Ich muss eben jedem angenommenen Socket eine eindeutige ID geben, der erste bekommt 0, der zweite 1 usw., damit ich diese später einfach als Indizes für ein Array benutzen kann...

    Und was ist das für ein Array?



  • na im einfachsten Fall sowas:

    SOCKET sockets[ANZAHL_MAXIMALE_CLIENTS];
    

    und dann soll eben der erste angenommene Socket an der Stelle 0 des Arrays stehen...



  • Was soll denn der Sinn dieses Socket-Arrays sein?



  • und was wäre daran schlimm wenn die socket deskriptoren nach einem anderne verfahren erstellen werden?



  • Nun der Sinn ist, dass das erste, was von den Sockets erhalten wird, die ID eines Raumes ist, in welchem der Benutzer gerade "chattet". Es wird dann ein weiteres Array erstellt, in welchem der Raum gespeichert ist, z.B.

    short socket2room[ANZAHL_MAXIMALE_CLIENTS];
    ...
    ...
    ...
    socket2room[id_des_sockets_von_dem_etwas_ueber_recv_empfangen_wurde] = id_des_raumes;
    

    später wird dann, wenn der Chatter etwas geschrieben hat, so etwas gemacht:

    for (i=0; i<ANZAHL_MAXIMALE_CLIENTS; i++)
        if (socket2room[i] == raum_in_dem_die_nachricht_versendet_wurde)
            send(sockets[i], ..., ..., ...);
    

    das Problem ist, wenn die ID's nicht bei 0 anfangen, dass dann das Array auch nicht ANZAHL_MAXIMALE_USER clients annehmen kann...



  • geh doch einfach davon aus, dass sockets zufaellige werte sind.
    das zwingt dich dazu, mal dein hirn einzuschalten und ordentlich zu programmieren, anstatt hier irgendeinen schwachfug auszubrueten, den du in deinem leben nicht auf die reihe bekommst und den ausser dir sowieso keiner nachvollziehen kann.



  • epoll bietet ja die Möglichkeit das du auch einen Zeiger (data.ptr) z.B. auf eine Struktur speichern kannst. Könnte man es damit nicht lösen?



  • @rackwitz: was gehten jetzt ab? sag doch einfach, dass du es nicht verstanden hast anstelle mich hier dumm anzumachen

    @hirn: das hatte ich auch schon versucht, aber bin gescheitert, könntest du evt. ein ganz kleines beispiel machen? wäre dir sehr dankbar



  • 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.


Anmelden zum Antworten