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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Fangod
8 / 8 / 0
Регистрация: 07.10.2011
Сообщений: 162
#1

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

03.07.2015, 16:52. Просмотров 217. Ответов 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;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 16:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно ли запустить приложение в linux? (C++):

Как запустить на Linux FFmpeg с полным конфигом? - C++
Подскажите, нежен кодик чтобы запустить на Linux FFmpeg с полным конфигом, как это можно сделать ? Если я в терминале пишу FFmpeg -i .

Можно ли программу, скомпилированную в Linux запустить на Windows ? - C++
Есть программа, собранная в Qt Creator в Linux Ubuntu , какие есть способы запустить её на Windows ? и есть ли способ сделать это без...

Запустить стороннее приложение на выполнение - C++
Допустим, есть две программы. Вторая должна открыться, если пользователь, например, введет нужное значение в первой. Как так сделать?

Невозможно запустить консольное приложение - C++
Проблема может даже очень тривиальная, но никак не могу въехать.. Ситуация одинаковая и с Билдером 6 и с ДевС++. Суть: при запуске...

Как запустить приложение на C++ без установки C++? - C++
Если написать какую-то прогу на с++ builder 6, скомпилить её в exe. А потом запустить на другом компе, то она не запускается. Похоже...

Никак не могу запустить reverse приложение c++ - C++
Нашёл такое решение: www.partow.net/programming/tcpproxy/index.html Скомпиллировал всё хорошо. Если я понял то позволяет из вне...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
dvano
131 / 62 / 16
Регистрация: 18.06.2014
Сообщений: 216
Завершенные тесты: 1
03.07.2015, 17:10 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Fangod Посмотреть сообщение
Смогу ли я его потом скомпилировать и запустить на linux?
Нет. Используются платформозависимые библиотеки.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 17:10
Привет! Вот еще темы с ответами:

Не удается запустить С++ приложение в среде NetBeans 7.0.1 (MinGW) - C++
Здравствуйте, Не получается запустить приложение в среде NetBeans версии 7.0.1. Настроил по идее все как полагается: Установил MinGW,...

Можно ли приложение написанное на c++ запустить в flash player? - C++
Можно ли приложение написанное на c++ запустить в flash player?

Запустить внешнее консольное приложение и вернуть результат - C++
Здравствуйте. Подскажите, пожалуйста, как можно запустить внешнее консольное приложение без создания окна и вернуть результат? Например...

Как запустить консольное приложение в фоновом режиме? - C++
у меня такая проблема, мне надо, чтоб консольное приложение при запуске сворачивалось в трей, или чтоб не было открытого окна cmd,...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru