[решено] Как под linux скомпилировать программу для Windows с поддержкой сети?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

MiK13
Сообщения: 1243
ОС: Linux Debian

[решено] Как под linux скомпилировать программу для Windows с поддержкой сети?

Сообщение MiK13 »

Возникла задача сделать имитатор сетевых пакетов для проверки работы приёмного устройства.
Написал программу, которая генерирует USP-пакеты.
Но говорят, что нужно, чтобы она работала под виндой.
Поставил компилятор mingw. Простые программы транслирует нормально.
Но вот на эту выдаёт

Shell

imit1.c:13:10: фатальная ошибка: sys/socket.h: Нет такого файла или каталога
13 | #include <sys/socket.h>
| ^~~~~~~~~~~~~~
компиляция прервана.
Неужели нет такой возможности?

Когда-то я писал программу на Delphi и рекомендации по сетевому обмену брал из книги "Системное программирование в UNIX"
Все функции для открытия сокета и создания канала связи работали (вроде, какой-то флаг не поддерживался)
То есть средства по сетевому обмену в Windows и Linux примерно одинаковы.
Но как мне странслировать программу передачи UDP пакетов, чтобы она могла работать под Windows?
Последний раз редактировалось MiK13 22.11.2022 16:10, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21230
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как под linux скомпилировать программу для Windows с поддержкой сети?

Сообщение Bizdelnick »

Нет в винде (и, соответственно, mingw) никакого sys/socket.h.
https://stackoverflow.com/questions/67726142/how-can-i-use-sys-socket-h-on-windows
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
cyberhoffman
Сообщения: 45
ОС: Gentoo

Re: Как под linux скомпилировать программу для Windows с поддержкой сети?

Сообщение cyberhoffman »

MiK13 писал:
15.11.2022 18:59
... Windows и Linux ...
Если нужна кроссплатформенность, то различия можно обернуть так:

Код: Выделить всё

#include <stdio.h>

#if defined(_WIN32)

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif //_WIN32_WINNT

#include <winsock2.h>
#include <ws2tcpip.h>

#define GETLASTERROR() (WSAGetLastError())
#define ISVALIDSOCKET(s) ((s) != INVALID_SOCKET)
#define CLOSESOCKET(s) closesocket(s)

#else //не _WIN32 но какой-нить __unix__

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <cerrno>

#define GETLASTERROR() (errno)
#define ISVALIDSOCKET(s) ((s) >= 0)
#define CLOSESOCKET(s) close(s)

#define SOCKET int

#endif //_WIN32

int main(){

#ifdef _WIN32
    WSADATA ws;
    if (WSAStartup(MAKEWORD(2, 2), &ws) != 0)
    {
        fprintf(stdout, "Error code: %d\n",  WSAGetLastError());
        return 1;
    }
#endif //_WIN32

//твой код здесь

#ifdef _WIN32
    WSACleanup();
#endif

    return 0;
}
Спасибо сказали:
MiK13
Сообщения: 1243
ОС: Linux Debian

Re: Как под linux скомпилировать программу для Windows с поддержкой сети?

Сообщение MiK13 »

cyberhoffman писал:
16.11.2022 16:13
MiK13 писал:
15.11.2022 18:59
... Windows и Linux ...
Если нужна кроссплатформенность, то различия можно обернуть так:

Код: Выделить всё

#include <stdio.h>

#if defined(_WIN32)

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600
#endif //_WIN32_WINNT

#include <winsock2.h>
#include <ws2tcpip.h>

#define GETLASTERROR() (WSAGetLastError())
#define ISVALIDSOCKET(s) ((s) != INVALID_SOCKET)
#define CLOSESOCKET(s) closesocket(s)

#else //не _WIN32 но какой-нить __unix__

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <cerrno>

#define GETLASTERROR() (errno)
#define ISVALIDSOCKET(s) ((s) >= 0)
#define CLOSESOCKET(s) close(s)

#define SOCKET int

#endif //_WIN32

int main(){

#ifdef _WIN32
    WSADATA ws;
    if (WSAStartup(MAKEWORD(2, 2), &ws) != 0)
    {
        fprintf(stdout, "Error code: %d\n",  WSAGetLastError());
        return 1;
    }
#endif //_WIN32

//твой код здесь

#ifdef _WIN32
    WSACleanup();
#endif

    return 0;
}
Спасибо. Как-нибудь поразбираюсь с этим примером.
Я, в принципе, решил задачу. Добавил символ _WIN_ и в makefile компилирую программу без него и с ним.
Нашёл пример обмена информацией через UDP, и основная задержка была с разрешением внешних ссылок. Опытным путём нашёл, что надо добавить -lwsock32
Spoiler
Правда, потом возникла другая проблема.
Начальник захотел, чтобы на экран выводилась таблица с текущими значениями.
Возникла проблема управления курсором.
На терминале Linux проблем нет. А вот под виндой... возникла странная ситуация.
То, что выводит printf экран никак не интерпретирует, просто как обычный знак.
Но если вывод направить в файл, а потом выдать команду type на этот файл, то управление курсором работает.
Так же оно работает в случае imit | cmd, но при этом cmd ругается, что что-то не может найти.
Решено было установкой git-bash. Под ним управление курсором работает.
Спасибо сказали: