Weird result of getsockopt

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


On Sunday, 24 May 2015 at 21:13:02 UTC, Daniel Kozak wrote:
> 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

I mean call it with something big enought, size than should be 
modified to real size


More information about the Digitalmars-d-learn mailing list