Test for SO_REUSEADDR
Francois Gouget
fgouget at codeweavers.com
Mon Jan 12 19:05:45 CST 2004
I turned Jeremy's program into a Wine conformance test. It shows that
unless we specify SO_REUSEADDR on the second socket, binding to an
address which is already in use fails. I confirmed this behavior on
Win98 and NT4. On Wine the test currently has two todo_wine.
Also note that the behavior with wsock32.dll (the 32bit winsock 1 dll)
seems to be the same.
Changelog:
* dlls/winsock/tests/sock.c
Jeremy White <jwhite at codeweavers.com>
Francois Gouget <fgouget at codeweavers.com>
Test the behavior of bind() wrt. SO_REUSEADDR.
--
Francois Gouget
fgouget at codeweavers.com
-------------- next part --------------
Index: dlls/winsock/tests/sock.c
===================================================================
RCS file: /home/cvs/wine/dlls/winsock/tests/sock.c,v
retrieving revision 1.11
diff -u -r1.11 sock.c
--- dlls/winsock/tests/sock.c 7 Oct 2003 03:30:47 -0000 1.11
+++ dlls/winsock/tests/sock.c 13 Jan 2004 00:47:38 -0000
@@ -625,6 +625,47 @@
CloseHandle ( client_ready[i] );
}
+static void test_so_reuseaddr()
+{
+ struct sockaddr_in saddr;
+ SOCKET s1,s2;
+ int rc,reuse,size;
+
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = htons(9375);
+ saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
+
+ s1=socket(AF_INET, SOCK_STREAM, 0);
+ ok(s1!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
+ rc = bind(s1, (struct sockaddr*)&saddr, sizeof(saddr));
+ ok(rc!=SOCKET_ERROR, "bind(s1) failed error: %d\n", WSAGetLastError());
+
+ s2=socket(AF_INET, SOCK_STREAM, 0);
+ ok(s2!=INVALID_SOCKET, "socket() failed error: %d\n", WSAGetLastError());
+
+ reuse=0x1234;
+ size=sizeof(reuse);
+ rc=getsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, &size );
+ ok(rc==0 && reuse==0,"wrong result in getsockopt(SO_REUSEADDR): rc=%d reuse=%d\n",rc,reuse);
+
+ todo_wine {
+ rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
+ ok(rc==SOCKET_ERROR, "bind() succeeded\n");
+ }
+
+ reuse = 1;
+ rc = setsockopt(s2, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
+ ok(rc==0, "setsockopt() failed error: %d\n", WSAGetLastError());
+
+ todo_wine {
+ rc = bind(s2, (struct sockaddr*)&saddr, sizeof(saddr));
+ ok(rc==0, "bind() failed error: %d\n", WSAGetLastError());
+ }
+
+ closesocket(s2);
+ closesocket(s1);
+}
+
/************* Array containing the tests to run **********/
#define STD_STREAM_SOCKET \
@@ -686,6 +727,8 @@
int i;
Init();
+ test_so_reuseaddr();
+
for (i = 0; i < NUM_TESTS; i++)
{
trace ( " **** STARTING TEST %d **** \n", i );
More information about the wine-patches
mailing list