1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include <winsock2.h>
#include <assert.h>
#define sassert assert
void dump() {
int err;
LPTSTR buf;
err = WSAGetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, &buf, 0, NULL);
printf("%d %s\n", err, buf);
LocalFree(buf);
}
int main() {
SOCKET s1, s2, s1d, s2d;
int val, rv, size;
WSADATA wsadata;
WSAPROTOCOL_INFO pi;
rv = WSAStartup(MAKEWORD(2, 2), &wsadata);
assert(!rv);
s1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(s1 > 0);
val = 1;
rv = setsockopt(s1, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
dump();
sassert(!rv);
s2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(s2 > 0);
val = 0;
rv = setsockopt(s2, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
sassert(!rv);
size = sizeof(val);
rv = getsockopt(s1, SOL_SOCKET, SO_KEEPALIVE, &val, &size);
assert(!rv);
printf("%d\n", val);
sassert(val == 1);
rv = getsockopt(s2, SOL_SOCKET, SO_KEEPALIVE, &val, &size);
assert(!rv);
sassert(val == 0);
rv = WSADuplicateSocket(s1, GetCurrentProcessId(), &pi);
assert(!rv);
s1d = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi, 0, WSA_FLAG_OVERLAPPED);
assert(s1d > 0);
rv = getsockopt(s1d, SOL_SOCKET, SO_KEEPALIVE, &val, &size);
assert(!rv);
printf("%d\n", val);
sassert(val == 1);
rv = WSADuplicateSocket(s2, GetCurrentProcessId(), &pi);
assert(!rv);
s2d = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, &pi, 0, WSA_FLAG_OVERLAPPED);
assert(s2d > 0);
rv = getsockopt(s2d, SOL_SOCKET, SO_KEEPALIVE, &val, &size);
assert(!rv);
printf("%d\n", val);
sassert(val == 0);
}
|