Weird result of getsockopt

Daniel Kozak via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun May 24 14:11:33 PDT 2015


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


More information about the Digitalmars-d-learn mailing list