quite simple network question

Wojciech Puchar wojtek at puchar.net
Fri Jul 5 06:28:29 UTC 2019


i wrote a program with client and server part - running under FreeBSD.

Client program use socket, then connect to establish TCP connection to 
server.

then it uses select every now and then to check if anything came from 
server, when select returns nonzero recv is executed.

If recv returns negative or zero - connection error is assumed, close is 
called and disconnect reported to user.


This works almost properly:

a) reception works fine
b) when server disconnects it's detected and reported.


But if network fails (for simulating i simply turn ethernet interface off)
it doesn't see it for a long time.

so between socket and connect i added

   a=1;
   setsockopt(serverconnfd,SOL_SOCKET,SO_KEEPALIVE,&a,sizeof(a));
   a=5; //KEEPALIVE co 5 sekund
   setsockopt(serverconnfd,SOL_SOCKET,TCP_KEEPIDLE,&a,sizeof(a));
   setsockopt(serverconnfd,SOL_SOCKET,TCP_KEEPINTVL,&a,sizeof(a));
   a=2; //2 próby nim uzna że rozłączony
   setsockopt(serverconnfd,SOL_SOCKET,TCP_KEEPCNT,&a,sizeof(a));

and i assumed it will keepalive every 5 seconds and after 2 failures 
behave as disconnect.

But even after minute of waiting i don't get disconnect.

What i am doing wrong?


More information about the freebsd-hackers mailing list