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