Форум программистов, компьютерный форум CyberForum.ru

Возможно ли запустить приложение в linux? - C++

Восстановить пароль Регистрация
 
Fangod
8 / 8 / 0
Регистрация: 07.10.2011
Сообщений: 154
03.07.2015, 16:52     Возможно ли запустить приложение в linux? #1
Я пишу в VS 2013
Ниже простой код web-сервера полностью скопированного из примера
Смогу ли я его потом скомпилировать и запустить на linux? Если нет, то как переносить код на другую платформу?


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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <iostream>
#include <sstream>
#include <string>
 
#include <WinSock2.h>
#include <WS2tcpip.h>
 
// Необходимо, чтобы линковка происходила с DLL-библиотекой 
// Для работы с сокетам
#pragma comment(lib, "Ws2_32.lib")
 
using std::cerr;
 
int main() {
    WSADATA wsaData; // служебная структура для хранение информации
    // о реализации Windows Sockets
    // старт использования библиотеки сокетов процессом
    // (подгружается Ws2_32.dll)
    int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
 
    // Если произошла ошибка подгрузки библиотеки
    if(result != 0) {
        cerr << "WSAStartup failed: " << result << "\n";
        return result;
    }
 
    struct addrinfo* addr = NULL; // структура, хранящая информацию
    // об IP-адресе слущающего сокета
 
    // Шаблон для инициализации структуры адреса
    struct addrinfo hints;
    ZeroMemory(&hints, sizeof(hints));
 
    hints.ai_family = AF_INET; // AF_INET определяет, что будет
    // использоваться сеть для работы с сокетом
    hints.ai_socktype = SOCK_STREAM; // Задаем потоковый тип сокета
    hints.ai_protocol = IPPROTO_TCP; // Используем протокол TCP
    hints.ai_flags = AI_PASSIVE; // Сокет будет биндиться на адрес,
    // чтобы принимать входящие соединения
 
    // Инициализируем структуру, хранящую адрес сокета - addr
    // Наш HTTP-сервер будет висеть на 8000-м порту локалхоста
    result = getaddrinfo("127.0.0.1", "8000", &hints, &addr);
 
    // Если инициализация структуры адреса завершилась с ошибкой,
    // выведем сообщением об этом и завершим выполнение программы 
    if(result != 0) {
        cerr << "getaddrinfo failed: " << result << "\n";
        WSACleanup(); // выгрузка библиотеки Ws2_32.dll
        return 1;
    }
 
    // Создание сокета
    int listen_socket = socket(addr->ai_family, addr->ai_socktype,
                               addr->ai_protocol);
    // Если создание сокета завершилось с ошибкой, выводим сообщение,
    // освобождаем память, выделенную под структуру addr,
    // выгружаем dll-библиотеку и закрываем программу
    if(listen_socket == INVALID_SOCKET) {
        cerr << "Error at socket: " << WSAGetLastError() << "\n";
        freeaddrinfo(addr);
        WSACleanup();
        return 1;
    }
 
    // Привязываем сокет к IP-адресу
    result = bind(listen_socket, addr->ai_addr, (int)addr->ai_addrlen);
 
    // Если привязать адрес к сокету не удалось, то выводим сообщение
    // об ошибке, освобождаем память, выделенную под структуру addr.
    // и закрываем открытый сокет.
    // Выгружаем DLL-библиотеку из памяти и закрываем программу.
    if(result == SOCKET_ERROR) {
        cerr << "bind failed with error: " << WSAGetLastError() << "\n";
        freeaddrinfo(addr);
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
 
    // Инициализируем слушающий сокет
    if(listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) {
        cerr << "listen failed with error: " << WSAGetLastError() << "\n";
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
 
    // Принимаем входящие соединения
    int client_socket = accept(listen_socket, NULL, NULL);
    if(client_socket == INVALID_SOCKET) {
        cerr << "accept failed: " << WSAGetLastError() << "\n";
        closesocket(listen_socket);
        WSACleanup();
        return 1;
    }
 
    const int max_client_buffer_size = 1024;
    char buf[max_client_buffer_size];
 
    result = recv(client_socket, buf, max_client_buffer_size, 0);
 
    std::stringstream response; // сюда будет записываться ответ клиенту
    std::stringstream response_body; // тело ответа
 
    if(result == SOCKET_ERROR) {
        // ошибка получения данных
        cerr << "recv failed: " << result << "\n";
        closesocket(client_socket);
    } else if(result == 0) {
        // соединение закрыто клиентом
        cerr << "connection closed...\n";
    } else if(result > 0) {
        // Мы знаем фактический размер полученных данных, поэтому ставим метку конца строки
        // В буфере запроса.
        buf[result] = '\0';
 
        // Данные успешно получены
        // формируем тело ответа (HTML)
        response_body << "<title>Test C++ HTTP Server</title>\n"
            << "<h1>Test page</h1>\n"
            << "<p>This is body of the test page...</p>\n"
            << "<h2>Request headers</h2>\n"
            << "<pre>" << buf << "</pre>\n"
            << "<em><small>Test C++ Http Server</small></em>\n";
 
        // Формируем весь ответ вместе с заголовками
        response << "HTTP/1.1 200 OK\r\n"
            << "Version: HTTP/1.1\r\n"
            << "Content-Type: text/html; charset=utf-8\r\n"
            << "Content-Length: " << response_body.str().length()
            << "\r\n\r\n"
            << response_body.str();
 
        // Отправляем ответ клиенту с помощью функции send
        result = send(client_socket, response.str().c_str(),
                      response.str().length(), 0);
 
        if(result == SOCKET_ERROR) {
            // произошла ошибка при отправле данных
            cerr << "send failed: " << WSAGetLastError() << "\n";
        }
        // Закрываем соединение к клиентом
        closesocket(client_socket);
    }
 
    // Убираем за собой
    closesocket(listen_socket);
    freeaddrinfo(addr);
    WSACleanup();
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 16:52     Возможно ли запустить приложение в linux?
Посмотрите здесь:

Как запустить консольное приложение в фоновом режиме? C++
C++ Как запустить приложение на компьютерах без установленной MSVS
C++ Как запустить консольное приложение через CreateProcess и спрятать его окно?
Невозможно запустить консольное приложение C++
Можно ли приложение написанное на c++ запустить в flash player? C++
Как запустить приложение, где не установлена visual studio C++
Запустить стороннее приложение на выполнение C++
Универсальное приложение, одинаково воспринимаемое C++ Borland и Visual C++ в Windows, и GCC в Linux C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dvano
 Аватар для dvano
131 / 62 / 16
Регистрация: 18.06.2014
Сообщений: 216
Завершенные тесты: 1
03.07.2015, 17:10     Возможно ли запустить приложение в linux? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Fangod Посмотреть сообщение
Смогу ли я его потом скомпилировать и запустить на linux?
Нет. Используются платформозависимые библиотеки.
Yandex
Объявления
03.07.2015, 17:10     Возможно ли запустить приложение в linux?
Ответ Создать тему
Опции темы

Текущее время: 16:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru