summaryrefslogtreecommitdiff
path: root/tests/c/winsockdup.c
blob: 4a8bd7dada41b9c8a1284a627bbf9980f0782f7a (plain)
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);
}