[C] Windows socket server stopt programma

Pagina: 1
Acties:

  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
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):
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.
Echter niks helpt. Het probleem treedt niet op zodra ik de listen weghaal, maar dan werkt mijn socket server natuurlijk niet ;)

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


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Ik zou zeggen break de uitvoering eens als hij 'vastloopt' en kijk waar het ding mee bezig is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
De backtrace van gdb zegt me eigenlijk weinig. De regels die info bevatten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#0 ... NlsUpdateSystemLocale ()
..
#8 ... NlsUpdateSystemLocale ()
...
#30 ... NlsUpdateSystemLocale ()
...
#34 ... Kernel32!BaseCleanupAppcompatCacheSupport ()
...
#36 ... ntdll!RtlpNtSetValueKey ()
...
#48 ... ntdll!AlpcMaxAllowedMessageLength ()
...
#52 ... ntdll!RtlpNtSetValueKey ()
#53 ... NlsUpdateSystemLocale ()
...
#59 ... NlsUpdateSystemLocale ()
...

Alle tussenregels bevatten alleen:
code:
1
#... ?? () from


Het eindigt bij nummer 61 en daarna:
code:
1
Cannot access memory at address 0x2430000





Ik heb wat nieuwe informatie. Zodra ik het voorbeeld van Windows zelf probeer dan werkt het ook niet.

Beide voorbeelden werken wel wanneer ik de compatibiliteitsmodus op Windows XP Service Pack 3 zet?




En het blijkt de virusscanner te zijn. Nu nog uitzoeken hoe je zorgt dat de virusscanner mijn programma gaat vertrouwen :)

[ Voor 25% gewijzigd door CurlyMo op 26-02-2015 21:45 ]

Sinds de 2 dagen regel reageer ik hier niet meer


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
CurlyMo schreef op donderdag 26 februari 2015 @ 17:38:
En het blijkt de virusscanner te zijn. Nu nog uitzoeken hoe je zorgt dat de virusscanner mijn programma gaat vertrouwen :)
Ik zou zeggen probeer eens een andere virusscanner :) Serieus, dat heb ik nog nooit meegemaakt.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • CurlyMo
  • Registratie: Februari 2011
  • Nu online
Het was heel mooi. Dit was de uitvoer:
code:
1
2
3
4
5
6
0
1
2
3
4
5

En toen een volledige stop. Daarna even de virusscanner uitzetten en:
code:
1
2
3
4
5
6
7
8
9
enz

:p

Sinds de 2 dagen regel reageer ik hier niet meer