Weird result of getsockopt
Daniel Kozak via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sun May 24 14:13:01 PDT 2015
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
More information about the Digitalmars-d-learn
mailing list