Re: Weird result of getsockopt

2015-05-24 Thread tcak via Digitalmars-d-learn

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?


Could you check the return value of setsockopt? Make sure it 
returns 0 as an indicator of successful operation. If so, then we 
can think about it further.


Re: Weird result of getsockopt

2015-05-24 Thread Daniel Kozak via Digitalmars-d-learn

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


Re: Weird result of getsockopt

2015-05-24 Thread Daniel Kozak via Digitalmars-d-learn

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


Re: Weird result of getsockopt

2015-05-24 Thread Daniel Kozak via Digitalmars-d-learn

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


Re: Weird result of getsockopt

2015-05-24 Thread CodeSun via Digitalmars-d-learn

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


You are right, thx.