On Sunday, 24 May 2015 at 21:11:34 UTC, Daniel Kozak wrote:
On Sunday, 24 May 2015 at 16:51:44 UTC, CodeSun wrote:
Hello guys,
Today, I found a weird problem when I was learning to enable
SO_KEEPALIVE for a specific socket. I use setsockopt to enable
keepalive firstly, and then use getsockopt to show if it is
enabled correctly.
My code snippet is listed below:
Dlang version:
import core.sys.posix.sys.socket;
import core.sys.posix.netinet.in_;
import std.c.stdio;
void main() {
int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int flag = 1;
size_t size;
setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, &flag,
cast(socklen_t)flag.sizeof);
flag = 0;
getsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, &flag,
cast(socklen_t*)&size);
printf("%d\n", flag);
}
C version:
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
int main() {
int sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
int flag = 1;
size_t size;
setsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, &flag,
(socklen_t)sizeof(flag));
flag = 0;
getsockopt(sfd, SOL_SOCKET, SO_KEEPALIVE, &flag,
(socklen_t*)&size);
printf("%d\n", flag);
return 0;
}
Dlang version always prints 0, which means keepalive is not
enabled, while C version can almost display 1 all the time as
expected.
So is there anything wrong inside the code? If not, whose
behavior is correct?
Cause your code is wrong:
"If the size of the option value is greater than option_len,
the value stored in the object pointed to by the option_value
argument shall be silently truncated. Otherwise, the
object pointed to by the option_len argument shall be modified
to indicate the actual
length of the value."
So because you have size set to 0 it will not work, you mast
call it again and than it will probably work.
In C this work because size is not initialize which mean it
could be anything
*call it again with right size and than it will probably work