M
mitch_m schrieb:
Ich habe es nun mit
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
if (setsockopt(listenfd,SOL_SOCKET,SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval)) == -1){
perror("setsockopt");
exit(1);
}
versucht... läuft aber nicht... bleibt in der TCP_schleife hängen....
wo muss ich das denn überhaupt hinsetzen? hinterm acctept?
oder hinter meinem socket()
Also das setzt du hinter den Funktionsaufruf:
listenfd = socket(AF_INET, SOCK_STREAM, 0) // return-Wert überprüfen
if (setsockopt(listenfd,SOL_SOCKET,SO_RCVTIMEO,(struct timeval *)&tv,sizeof(struct timeval)) == -1){
perror("setsockopt");
exit(1);
}
/*
* solltest du vieleicht auch mit SO_SNDTIMEO und TCP_NODELAY machen
* diese machen send() blockadefrei und schicken auch kleine Packete
*/
if (setsockopt(listenfd,SOL_SOCKET,SO_SNDTIMEO,(struct timeval *)&tv,sizeof(struct timeval)) == -1){
perror("setsockopt");
exit(1);
}
int flag = 1;
if (setsockopt(listenfd,IPPROTO_IP,TCP_NODELAY, (void*)&flag, sizeof(int)) == -1){
perror("setsockopt");
exit(1);
}
/*
* Hiernach je ob Server oder Client
* Pseudo-Code
*/
// Server
bind
listen
accept
// client
connect
Ich würde aber dein timval deutlich kleiner machen. Ich verwende tv.tv_sec=0 und tv.tv_usec=300, da dein Programm sonst immer wieder für 1 Sekunde hängen wird (eventuell auslagern in pthread?).
Du wirst aber Problem beim send() und recv() bekommen. Hier musst du dir eine gute Routine überlegen, wie du große Daten empfangen oder senden kannst. Die blockierende send() bzw. recv() nehmen dir hier eine Menge Denkarbeit ab. Aber du solltest keine Angst davor haben, trotzdem die Timeouts einzusetzen. Habe so einen Server und Client geschrieben, welcher Bilder von einer Kamera vom Server an den Client schickt. Einfach recv() und send() in while-Schleife packen und den Return-Wert + Errno checken, dann bekommt man eine gute Routine hin.