Jak przerobić na WinSock ?

0

Chciałbym przerobić na Windows
oryginalny kod https://github.com/BerkeleyLab/XVC-FTDI-JTAG/blob/master/ftdiJTAG.c

Problematyczny fragment to funkcja fdopen() która powinna zamienić SOCKET na FILE*
Na Linux działa wszystko poprawnie
Na Windows zawsze fdopen failed

    if ((s = createSocket(bindAddress, port)) < 0) {
        exit(1);
    }
    for (;;) {
        struct sockaddr_in farAddr;
        socklen_t addrlen = sizeof farAddr;
        FILE *fp;

        int fd = accept(s, (struct sockaddr *)&farAddr, &addrlen);
        if (fd < 0) {
            fprintf(stderr, "Can't accept connection: %s\n", strerror (errno));
            exit(1);
        }
        ...
        fp = fdopen(fd, "r");
        if (fp == NULL) {
            fprintf(stderr, "fdopen failed: %s\n", strerror(errno));
            close(fd);
            exit(2);
        }
        else {
            processCommands(fp, fd, usb);  // <<== ten punkt nigdy nie jest osiagniety na Windows 
            fclose(fp);  /* Closes underlying socket, too */
        }

w msys2 funkcja fdopen jest zadeklarowana w stdio.h ale czy powinna dzialac na platwofmie Win to nie mam pojecia

#if !defined(NO_OLDNAMES) || !defined(_POSIX)

  FILE *__cdecl fdopen(int _FileHandle,const char *_Format) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
#endif
3

A WSAStartup wołasz gdzieś po drodze? W zależności od wersji robisz mniej więcej w ten sposób

WSADATA WsaData;
if(WSAStartup(MAKEWORD(2,2), &WsaData) != 0) // 2.2 to najnowsza wersja
{
  // error
}
else
{
  // all good
}

Instacji WSADATA nie musisz nigdzie trzymać. Wołasz to raz na proces zanim zaczniesz dotykać socketów.

A no i sam nie jestem pewien czy fdopen będzie działać na windowsie. Na linuksie socket to "zwykły" plik, z którego możesz czytać i do którego możesz pisać. Na windowsie interfejs socketowy to bardziej wraper na jakiś ich specyficzny networking. Tym nie mniej, jeśli będziesz się trzymać podstawowego API który jest opisany w BJ's guide to network programming to będzie działać.

1

podsumowanie:

  • udalo sie to poprawić i uruchomić ten kod na Windows, tak jak napisal @several trzeba bylo dodac WSAStartup/WSACleanup aby WinSock ruszył, wykasowałem użycie fdopen i wstawiłem recv oraz send zamiast funkcji które były w wersji Linux.

1 użytkowników online, w tym zalogowanych: 0, gości: 1