1

Тема: Як запустити на Ubuntu те, що скомпільоване на Windows?

Хай. Написав простецький сервер

#include <cstdio>
#include <iostream>
#include <winsock2.h>
#include <cstring>
#include <vector>
#include <windows.h>

std::string longToIp(long ip)
{
    int b[32];
    std::string fin[4];
    int it = 0;
    while (ip > 0)
    {
        int tmp = ip % 2 == 0 ? 0 : 1;
        b[it] = tmp;
        ip /= 2;

        if (it % 8 == 0 && it != 0)
        {
            int tmp1 = 0;
            for (int i = it - 8, j = 0; i < it; i++, j++)
            {
                tmp1 += pow(2, j)*b[i];
            }
            char tmp2[4];
            _itoa_s(tmp1, tmp2, 4, 10);
            fin[(int)floor(it / 8.0) - 1] = tmp2;

        }
        it++;

    }

    int tmp1 = 0;
    for (int i = 0; i < it % 8; i++)
    {
        tmp1 += pow(2, i)*b[(it - it % 8) + i];
    }

    char tmp2[4];
    _itoa_s(tmp1, tmp2, 4, 10);
    fin[3] = tmp2;

    std::string res;

    for (int i = 0; i < 4; i++)
    {
        res += fin[i];
        if (i != 3)
            res += '.';
    }

    return res;
}

class Client
{
public:
    SOCKADDR_IN addr;
    int addrLength;
    Client()
    {
        addrLength = sizeof(addr);
    }
    bool Compare(const Client& other)
    {
        if (other.addr.sin_addr.S_un.S_addr == addr.sin_addr.S_un.S_addr
            && other.addr.sin_port == addr.sin_port)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};


int main()
{
    WSADATA WsaData;
    SOCKET sock;

    int err = WSAStartup(0x0101, &WsaData);
    if (err == SOCKET_ERROR)
    {
        printf("WSAStartup() failed: %ld\n", GetLastError());
        system("pause>>void");
        return 1;
    }

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        std::cout << "Cannot create a socket" << std::endl;
        system("pause>>void");
        return 1;
    }

    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(80);
    sin.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(sock, (SOCKADDR*)&sin, sizeof(sin)) < 0)
    {
        std::cout << "Bind error: " << GetLastError() << std::endl;
        system("pause>>void");
        return 1;
    }

    int err3 = listen(sock, SOMAXCONN);

    std::vector<Client> from;

    while (true)
    {
        char recvBuff[256];
        Client client;

            int n = recvfrom(sock, recvBuff, 256, 0, (sockaddr*)&client.addr, (int*)&client.addrLength);
            if (n < 0)
            {
                std::cout << "Get <0 bytes: " << n << std::endl;
            }
            else
            {
                std::cout << "Received: " << n << " bytes, from ip: " << longToIp(client.addr.sin_addr.S_un.S_addr).data()
                    << "  from port: " << htons(client.addr.sin_port) << std::endl;
                std::string str = recvBuff;
                str.resize(n);
                std::cout << str.data() << std::endl;

                bool add = true;

                if (from.size() > 0)
                {
                    for (size_t i = 0; i < from.size(); i++)
                    {
                        if (!from[i].Compare(client))
                        {
                            sendto(sock, recvBuff, n, 0, (sockaddr*)&from[i].addr, from[i].addrLength);
                        }
                        else
                        {
                            add = false;
                        }
                    }
                }
                if (add)
                {
                    from.push_back(client);
                }
            }
        }
    

    closesocket(sock);

    system("pause>>void");
    return 0;
}

Замовив собі халявний впн і поставив там ubuntu, бо окрім лінуксів там нічо не ставиться. Далі я хочу запустити там свій server.exe.
Що я маю робити, аби воно запрацювало? Let's експерементувати!

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

2

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

wine установи, не знаю як там у ваших лінуксах ставиться
компільнути можна за допомогою winegcc
якщо програма консольна wineconsole допоможе

Подякували: koala1

3

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

sewen написав:

wine установи, не знаю як там у ваших лінуксах ставиться
компільнути можна за допомогою winegcc
якщо програма консольна wineconsole допоможе

А як його компілювати саме під віндовс, щоб потім можно було просто закинути файлик на убунту і запустити його там?

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

4

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

судячи по коду то може і не компільнутись, сильно там все завязано, я не екстрасенс, а шо це, і звідки взяли ?
скомпілюйте в віндовсі, не знаю чим, толком я там працюю з clang рідко і GCC, та інші компілятори.

завичайно може бути

$ winegcc code.cpp -o code

хоча наврядчи

5

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

FakiNyan написав:

А як його компілювати саме під віндовс, щоб потім можно було просто закинути файлик на убунту і запустити його там?

Просто закинути файлик на іншу ось і запустити це не на плюсах треба було писати, а на джаві
Плюси дають переносимість сорців, але не виконуваних кодів.
Перенесіть весь проект на убунту і в теорії має скомпілюватись без необхідності вносити зміни в код.

Qt 5.4.0

6

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

sudo apt-get install wine
Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

7

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

0xDADA11C7 написав:
sudo apt-get install wine

та не встановлюється
http://puu.sh/c2Pxc/0e89cd8da8.png

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

8

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

та не встановлюється

от того мені лінукси і неподобаються
хто скаже є щось схоже в apt-get типу пошук, шось назразок  apt-get search wine

9 Востаннє редагувалося yarko (07.10.2014 14:51:52)

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

а не простіше перекомпілити, ніж паритися з емуляторами?

sewen написав:

хто скаже є щось схоже в apt-get типу пошук, шось назразок  apt-get search wine

є графічний центр програм

Qt 5.4.0

10

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

yarko написав:

а не простіше перекомпілити, ніж паритися з емуляторами?

там тре багато чо змінювати, як бачите, в мене там використовуються віндусовські бібліотеки

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

11

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

тоді компілюйте під лінукс, не забуваючи додати трішки препроцесорного коду, який визначає архітектуру він32 і включає windows.h

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

12 Востаннє редагувалося yarko (07.10.2014 15:00:01)

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

FakiNyan написав:
yarko написав:

а не простіше перекомпілити, ніж паритися з емуляторами?

там тре багато чо змінювати, як бачите, в мене там використовуються віндусовські бібліотеки

пишіть на Qt. не доведеться змінювати код при переносі

хм.. а що платформозалежне ви використовуєте?

Qt 5.4.0

13

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

yarko написав:
FakiNyan написав:
yarko написав:

а не простіше перекомпілити, ніж паритися з емуляторами?

там тре багато чо змінювати, як бачите, в мене там використовуються віндусовські бібліотеки

пишіть на Qt. не доведеться змінювати код при переносі

хм.. а що платформозалежне ви використовуєте?

та там просто різні функції використовуються, на віндовсі вони одні, та лінупсі там зовсім інше

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

14

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

та там просто різні функції використовуються, на віндовсі вони одні, та лінупсі там зовсім інше

Функції ті ж, просто різні заголовкові файли треба підключати

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

15

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

0xDADA11C7 написав:

та там просто різні функції використовуються, на віндовсі вони одні, та лінупсі там зовсім інше

Функції ті ж, просто різні заголовкові файли треба підключати

а як бути з асинхронними сокетами? для цього я створюю проект Win32 та використовую функції WinMain і т.д.
А як з цим бути в лінупсі?

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

16

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

робота з мережею не унікальна для віндовса річ. вона є на всіх осях.

Qt 5.4.0

17

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

yarko написав:

робота з мережею не унікальна для віндовса річ. вона є на всіх осях.

а методи WinMain і т.д. однакові?

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P

18 Востаннє редагувалося yarko (07.10.2014 15:37:42)

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

точки входу в програму різні для різних ОС, але при використанні кросплатформенних бібліотек це не важливо.

чим ви компілюєте в вінді ваш проект?

Qt 5.4.0

19

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

може бути ситуація коли кроссплатфоменна програма не працює, але тоді треба достановлювати модулі додаткові, скіжімо на мережу, сокет, чи якусь допоміжну утиліту типу qtdbus, etc ...

20

Re: Як запустити на Ubuntu те, що скомпільоване на Windows?

yarko написав:

точки входу в програму різні для різних ОС, але при використанні кросплатформенних бібліотек це не важливо.

чим ви компілюєте в вінді ваш проект?

в вінді пишу і компілю, ага. А шо то за бібліотеки? Чи є якась така штука, щоб от я писав код на вінді, і міг цей самий код компілювати нормально як на вінді так і на лінуксі?
І взагалі дайте порад щодо написання серверу для онлайн гри. Я там хочу використовувати свій протокол на основі UDP, і той сервер має бути асинхронним і могти працювати як на вінді, так і на лінуксі

тут спілкуються українці (серед них є програмісти)
https://discord.gg/Zk29v4P