Signal / Event / Interrupt für socket recv()?

Thanatos13

Grünschnabel
Hallo,

gibt es für sockets eine Art Signal, Event oder Interrupt, das mir anzeigt, dass neue Daten am socket anliegen um mit recv abgeholt werden zu können?
Da es mir um zeitkritische Anwendungen geht (~200us) wäre eine zusätzliche Abfrage über poll() nicht die beste Lösung.
Recv() ist zur Zeit noch blocking, mit einem Timeout von 100us (übers socket definiert).

Das ganze ist unter Linux (Kubuntu 8.10) programmiert.

Hier ein wenig Code zur Verdeutlichung:

Code:
[...]
while (((sock = socket(PF_PACKET, SOCK_RAW, htons(0x88A4))) < 0) && tries < MAX_TRIES_SOCKET) {
		sleep(1);
		tries++;
	}

int64_t timeout = TIMEOUT_NSEC;
	if(ioctl(sock,RTNET_RTIOC_TIMEOUT,&timeout) < 0) {
		perror("Cannot set timout");
		printf("Continue without timeout\n");
	}

[...]


    int len_recv = recv(sock,buffer_receive,sizeof(buffer_receive),0);
    if(len_recv < 0) {
	   perror("low_level_input: Cannot receive msg: ");
	    return false;
    }

[...]
 
Hallo,

nein gibt es AFAIK nicht. Aber wenn du recv blockierend aufrufst hast du doch den selben Effekt eines Events / Signals / Interrupts nämlich genau dann wenn recv zurückkehrt. Dann sind nämlich entweder Daten im Puffer oder ein Fehler ist aufgetreten.

Wenn du nebenher noch was erledigen willst rufst du recv eben innerhalb eines neuen Threads auf.

Gruß,
RedWing
 
Das Aufteilen von send und recv in 2 Threads wollte ich eigentlich vermeiden.
ich habe mir gedacht, dass ich den thread nach dem sende solange unterbreche bis daten am socket zum empfangen anliegen. dann wollte ich recv erst aufrufen.
in der zwischenzeit laufen noch weitere threads.
 
ich glaube, alle Antworten bis jetzt sind Quark!

Benutze einfach die Funktion select().
Das ist genau das, was Du suchst!

Außerdem solltest Du Dir vielleicht mal "den Stevens" zulegen. Das ist das Referenzwerk für die Art der Programmierung, an der Du augenscheinlich gerade sitzt.

"Unix Network Programming" Band I
<http://www.kohala.com/start/unpv12e.html>

Grüße,
Modem-man
 
Zurück