De afgelopen paar dagen ben ik bezig om mijn Linux / FreeBSD applicaties uit te breiden met Windows ondersteuning. Dat lukt met het her en der aanpassen van niet compatible code tot nu toe prima. Echter loop ik tegen een probleem aan waar ik de oorzaak niet van kan vinden.
Een van de onderdelen van mijn programma is dat hij een socket server start zodat cliënts er verbinding mee kunnen leggen. Dat werkt in Linux en FreeBSD prima, maar in Windows niet. Dit is de concrete code die faalt (hier de Windows versie):
Het compileren van de uiteindelijke Windows binary doe ik a.d.v. mingw32 op Linux Debian
Zodra ik dit programma start in de Windows command line dan loopt hij tussen de 6 en 10 seconden helemaal vast.
Wat ik heb geprobeerd zonder resultaat:
Nu is dit de eerste keer dat ik een C applicatie voor Windows probeer te schrijven, dus een uitgebreide kennis van de Windows C API heb ik niet. Het kan dus zijn dat ik iets triviaals over het hoofd zie, maar wat? Wie o wie kan me verder helpen?
Een van de onderdelen van mijn programma is dat hij een socket server start zodat cliënts er verbinding mee kunnen leggen. Dat werkt in Linux en FreeBSD prima, maar in Windows niet. Dit is de concrete code die faalt (hier de Windows versie):
C:
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
| #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define WIN32_LEAN_AND_MEAN #include <winsock2.h> #include <ws2tcpip.h> void main() { struct sockaddr_in address; unsigned int addrlen = sizeof(address); int opt = 1; int socket_server = 0; WSADATA wsa; if(WSAStartup(0x202, &wsa) != 0) { printf("could not initialize new socket"); WSACleanup(); exit(EXIT_FAILURE); } memset(&address, '\0', sizeof(struct sockaddr_in)); if((socket_server = socket(AF_INET, SOCK_STREAM, 0)) == 0) { printf("could not create new socket"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = 0; if(bind(socket_server, (struct sockaddr *)&address, sizeof(address)) < 0) { printf("cannot bind to socket port %d, address already in use?", address); WSACleanup(); exit(EXIT_FAILURE); } if(listen(socket_server, 3) < 0) { printf("failed to listen to socket"); WSACleanup(); exit(EXIT_FAILURE); } int i = 0; while(1) { printf("%d\n", i); i++; Sleep(1000); } } |
Het compileren van de uiteindelijke Windows binary doe ik a.d.v. mingw32 op Linux Debian
code:
1
| i686-w64-mingw32-gcc -o test.exe test.c -lws2_32 -liphlpapi |
Zodra ik dit programma start in de Windows command line dan loopt hij tussen de 6 en 10 seconden helemaal vast.
Wat ik heb geprobeerd zonder resultaat:
- Firewall helemaal uitzetten.
- Andere poort kiezen.
- Willekeurige poort laten kiezen.
Nu is dit de eerste keer dat ik een C applicatie voor Windows probeer te schrijven, dus een uitgebreide kennis van de Windows C API heb ik niet. Het kan dus zijn dat ik iets triviaals over het hoofd zie, maar wat? Wie o wie kan me verder helpen?
Sinds de 2 dagen regel reageer ik hier niet meer