- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Is there a restriction on the TCP stack on the use of KEEP_ALIVE option ? I didn't success in using this option : There is no error message, but I can't see any additional exchanges on the TCP exchanges and I get no indication when I disconnect the cable. Maybe I'm wrong in my code, here is an extract :int sockval;
int length;
/* Create the TCP socket */
if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
TRACE_CONNECT "Error : cannot create the control socket\n");
return -1;
}
sockval = 1;
length = sizeof(sockval);
if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &sockval, length) == -1)
{
TRACE_CONNECT "Warning : KeepAlive option set failed\n");
}
memset(&adsock_server, 0, sizeof(adsock_server));
adsock_server.sin_family = AF_INET;
adsock_server.sin_port = htons(G_JGXEOEinfo.omcpTCPPort);
adsock_server.sin_addr.s_addr = htonl(G_JGXEOEinfo.omcpIPAddress);
if (connect(fd, (struct sockaddr *)&adsock_server, sizeof(adsock_server)) == -1)
{
TRACE_CONNECT "Warning : connection to server (IP=%08X Port=%04X) failed\n", (unsigned int)G_JGXEOEinfo.omcpIPAddress, G_JGXEOEinfo.omcpTCPPort);
}
else
{
//TRACE_CONNECT "Control Application connected to server (IP=%08X Port=%04X)\n", (unsigned int)G_JGXEOEinfo.omcpIPAddress, G_JGXEOEinfo.omcpTCPPort);
return fd;
}
Thank you for your contribution.
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I took some testing but the keepalive works as it is suppose to. The default timer is 2 hours so unless you change it you will be waiting a long time before anything happens. If you build the kernel with sysctl support you can change the values through the proc file system. They live in /proc/sys/net/ipv4 you should change both tcp_keepalive_time & tcp_keepalive_intvl to shorter values. If you change these values it is global so all sockets opened after the change will use the new values. If you want the change to be only for a specific socket use the setsockopt with the level IPPROTO_TCP and the option name TCP_KEEPIDLE & TCP_KEEPINTVL. You could also change the option TCP_KEEPCNT to change the number of probes before it take action (default is 9). To detect a failure you need have a read posted and you will receive a read timeout error. Hope this helps.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
OK it works fine. The main difference with "standard" code that I could seen, is the need to set IPPROTO_TCP in the socket function call (instead of 0). For convenience, I give the final code that works fine : <div class='quotetop'>QUOTE </div> --- Quote Start --- if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { TRACE_CONNECT "Error : cannot create the control socket\n"); return -1; } /* Set options of that socket */ sockval = TCP_KEEPIDLE_VALUE; if (setsockopt (fd, SOL_TCP, TCP_KEEPIDLE, (void *)&sockval, sizeof(sockval)) == -1) { TRACE_CONNECT "Warning : TCP_KEEPIDLE option set failed\n"); } sockval = TCP_KEEPCNT_VALUE; if (setsockopt (fd, SOL_TCP, TCP_KEEPCNT, (void *)&sockval, sizeof(sockval)) == -1) { TRACE_CONNECT "Warning : TCP_KEEPCNT option set failed\n"); } sockval = TCP_KEEPINTVL_VALUE; if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &sockval, sizeof(sockval)) == -1) { TRACE_CONNECT "Warning : TCP_KEEPINTVL option set failed\n"); } sockval = SO_KEEPALIVE_VALUE; if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &sockval, sizeof(sockval)) == -1) { TRACE_CONNECT "Warning : KeepAlive option set failed\n"); } /* Permanent try of connection */ while (1) { memset(&adsock_server, 0, sizeof(adsock_server)); adsock_server.sin_family = AF_INET; adsock_server.sin_port = htons(TCPPort); adsock_server.sin_addr.s_addr = htonl(IPAddress); if (connect(fd, (struct sockaddr *)&adsock_server, sizeof(adsock_server)) == -1) { TRACE_CONNECT "Warning : connection to server failed\n"); }[/b] --- Quote End ---- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi I am from Bangalore, India team. I am trying to implement Keep alive to get some advantage in Test time. I am facing some challenges with respect to Vmin forwarding. Is there any one who could help me out in this. Thank you very much.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page