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 експерементувати!

2

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

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

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

3

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

sewen написав:

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

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

4

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

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

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

$ winegcc code.cpp -o code

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

5

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

FakiNyan написав:

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

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

6

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

sudo apt-get install wine

7

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

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

та не встановлюється
http://не-дійсний-домен/c2Pxc/0e89cd8da8.png

8

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

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

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

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

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

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

sewen написав:

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

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

10

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

yarko написав:

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

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

11

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

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

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

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

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

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

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

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

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

13

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

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

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

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

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

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

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

14

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

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

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

15

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

0xDADA11C7 написав:

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

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

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

16

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

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

17

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

yarko написав:

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

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

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

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

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

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

19

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

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

20

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

yarko написав:

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

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

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