[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Monotone-commits-diffs] net.venge.monotone.visualc: 8d707e5ee0b0b3a9a3
From: |
code |
Subject: |
[Monotone-commits-diffs] net.venge.monotone.visualc: 8d707e5ee0b0b3a9a35f2e15f797550f7356be44 |
Date: |
Wed, 22 Dec 2010 05:32:18 GMT |
revision: 8d707e5ee0b0b3a9a35f2e15f797550f7356be44
date: 2010-12-22T05:31:25
author: Timothy Brownawell <address@hidden>
branch: net.venge.monotone.visualc
changelog:
Make the win32 check_net program actually do something.
manifest:
format_version "1"
new_manifest [2be751e7cce05e22bdb9239a9f7518f96a9d1f24]
old_revision [8d4e5b258f2346827e2f43d88f1511bd2b3e4dc0]
patch "visualc/check_net.vcxproj"
from [0860ea6a0ee8ffacace4a1883a4153207f37c4b1]
to [d76076ffecac9ce497970991c46f4528d5ddcffc]
patch "win32/tester-check-net.cc"
from [1fb16b6a801951299889667d726a96894ec77121]
to [2287668986d3d9048fba937142222ae3703556ab]
============================================================
--- win32/tester-check-net.cc 1fb16b6a801951299889667d726a96894ec77121
+++ win32/tester-check-net.cc 2287668986d3d9048fba937142222ae3703556ab
@@ -1,4 +1,4 @@
-// Copyright (C) 2008 Zack Weinberg <address@hidden>
+// Copyright (C) 2010 Timothy Brownawell <address@hidden>
//
// This program is made available under the GNU GPL version 2.0 or
// greater. See the accompanying file COPYING for details.
@@ -7,10 +7,124 @@
// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE.
-/* Stub - needs implementing. See lua-testsuite.lua (very end) for rationale,
- and unix/tester-check-net.cc for behavior to emulate. */
+// threads
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+
+// sockets
+#include <WinSock2.h>
+#include <WS2tcpip.h>
+
+#include <stdio.h>
+
+DWORD WINAPI timer(void *)
+{
+ Sleep(5000);
+ ExitProcess(5);
+}
+
int main(void)
{
+ char const myname[] = "check_net";
+ CreateThread(0, 0, &timer, 0, 0, 0);
+
+ WSADATA wsa_data;
+ int started = WSAStartup(MAKEWORD(2,2), &wsa_data);
+ if (started != 0)
+ {
+ fprintf(stderr, "%s: failed to init Winsock: %d\n", myname, started);
+ ExitProcess(1);
+ }
+ bool use_ip6 = false;
+
+ SOCKET listen_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+ if (listen_sock == INVALID_SOCKET)
+ {
+ use_ip6 = true;
+ SOCKET listen_sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+ if (listen_sock == INVALID_SOCKET)
+ ExitProcess(1);
+ }
+
+ struct sockaddr_in my_addr_4;
+ struct sockaddr_in6 my_addr_6;
+ struct sockaddr *my_addr;
+ int my_addr_size;
+ if (use_ip6)
+ {
+ my_addr_6.sin6_family = AF_INET6;
+ my_addr_6.sin6_port = 0x5555;
+ for (int i = 0; i < 15; ++i)
+ my_addr_6.sin6_addr.u.Byte[i] = 0;
+ my_addr_6.sin6_addr.u.Byte[15] = 1;
+
+ my_addr = (struct sockaddr *) &my_addr_6;
+ my_addr_size = sizeof(my_addr_6);
+ }
+ else
+ {
+ my_addr_4.sin_family = AF_INET;
+ my_addr_4.sin_port = 0x5555;
+ WSAHtonl(listen_sock, 0x7f000001, &my_addr_4.sin_addr.S_un.S_addr);
+
+ my_addr = (struct sockaddr *) &my_addr_4;
+ my_addr_size = sizeof(my_addr_4);
+ }
+
+ if (bind(listen_sock, my_addr, my_addr_size) != 0)
+ ExitProcess(1);
+ if (listen(listen_sock, 1) != 0)
+ ExitProcess(1);
+
+ SOCKET client_sock = WSASocket(use_ip6 ? AF_INET6 : AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 0, WSA_FLAG_OVERLAPPED);
+ if (WSAConnect(client_sock, my_addr, my_addr_size, 0, 0, 0, 0) != 0)
+ {
+ fprintf(stderr, "%s: WSAConnect: %d\n", myname, WSAGetLastError());
+ ExitProcess(1);
+ }
+ SOCKET server_sock = WSAAccept(listen_sock, 0, 0, 0, 0);
+ if (server_sock == INVALID_SOCKET)
+ ExitProcess(1);
+
+ WSABUF buffer;
+ buffer.buf = "abc123";
+ buffer.len = 7;
+ DWORD amount_sent;
+ WSAOVERLAPPED overlapped;
+ overlapped.hEvent = WSACreateEvent();
+ int sent = WSASend(client_sock, &buffer, 1, &amount_sent, 0, &overlapped, 0);
+ if (sent != 0 && WSAGetLastError() != WSA_IO_PENDING)
+ ExitProcess(1);
+
+ WSABUF rbuffer;
+ char foo[8] = {0, 0, 0, 0, 0, 0, 1, 0};
+ rbuffer.buf = foo;
+ rbuffer.len = 8;
+ DWORD amount_rcvd;
+ WSAOVERLAPPED roverlapped;
+ roverlapped.hEvent = WSACreateEvent();
+ DWORD rcvflags = 0;
+ int rcvd = WSARecv(server_sock, &rbuffer, 1, &amount_rcvd, &rcvflags, &roverlapped, 0);
+ if (rcvd != 0)
+ {
+ int er = WSAGetLastError();
+ if (er != WSA_IO_PENDING)
+ {
+ fprintf(stderr, "%s: WSARecv: %d\n", myname, er);
+ ExitProcess(1);
+ }
+ }
+
+ if (sent != 0)
+ if (WSAWaitForMultipleEvents(1, &overlapped.hEvent, FALSE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)
+ ExitProcess(1);
+ if (rcvd != 0)
+ if (WSAWaitForMultipleEvents(1, &roverlapped.hEvent, FALSE, WSA_INFINITE, FALSE) == WSA_WAIT_FAILED)
+ ExitProcess(1);
+
+ if (strcmp("abc123", rbuffer.buf) != 0)
+ ExitProcess(1);
+
return 0;
}
============================================================
--- visualc/check_net.vcxproj 0860ea6a0ee8ffacace4a1883a4153207f37c4b1
+++ visualc/check_net.vcxproj d76076ffecac9ce497970991c46f4528d5ddcffc
@@ -71,6 +71,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
+ <AdditionalDependencies>ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Monotone-commits-diffs] net.venge.monotone.visualc: 8d707e5ee0b0b3a9a35f2e15f797550f7356be44,
code <=