2016-10-10 4 views
1

Я только что установил CLion сегодня в своей новой Linux-среде, и я решил попробовать создать простой сервер сокетов. В конечном итоге я хочу создать сервер сокетов на C++ (потому что я уже делал тонны в C#, Java, Python, PHP, Node.js ...).C++ Boost Ошибки сокета ASIO

Я получил следующий код:

// 
// Created by josh on 10-10-16. 
// 

#ifndef RANDOMPROGRAM_TEST_H 
#define RANDOMPROGRAM_TEST_H 

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/asio.hpp> 

using namespace boost::asio::ip; 

class test { 

private: 
    boost::asio::io_service io_service; 
    tcp::acceptor acceptor; 
    tcp::socket socket; 

    test() { 
     this->acceptor = tcp::acceptor(this->io_service, tcp::endpoint(tcp::v4(), 30000)); 

     this->socket = tcp::socket(io_service); 

     acceptor.async_accept(this->socket, boost::bind(&this->handle_accept, this, this->socket, NULL)); 
    } 

    void handle_accept(tcp::socket* client, const boost::system::error_code& error) { 

    } 
}; 
#endif //RANDOMPROGRAM_TEST_H 

В моем главном файле .cpp (который вызывается при выполнении программы):

#include "test.h" 

int main() { 
    test t(); 
    return 0; 
} 

Наконец, мой CMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(Randomshitprogram) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

find_package(Boost 1.62.0 COMPONENTS system filesystem REQUIRED) 

if(Boost_FOUND) 

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}") 
    message(STATUS "Boost_VERSION: ${Boost_VERSION}") 

    include_directories(${Boost_INCLUDE_DIRS}) 

endif() 

set(SOURCE_FILES main.cpp test.h) 
add_executable(Randomshitprogram ${SOURCE_FILES}) 

Теперь, когда я пытаюсь выполнить программу, она дает следующую ошибку, а также, возможно, массу ошибок:

No matching function for call to ‘boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::basic_socket_acceptor()’ 

Журнал:

http://pastebin.com/a09FvuTk

ответ

3

when I try to execute

вы имеете в виду собрать, правильно? Это ошибка компиляции, а не время выполнения.

No matching function for call to 'boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>::basic_socket_acceptor()'

Здесь задокументирован конструктор для boost::asio::basic_socket_acceptor. Нет конструктора по умолчанию, о чем вам говорит ваш компилятор.

Вы вызова (или пытается) конструктор по умолчанию здесь:

test() /* here */ { 
    this->acceptor = tcp::acceptor(this->io_service, tcp::endpoint(tcp::v4(), 30000)); 

    this->socket = tcp::socket(io_service); 

    acceptor.async_accept(this->socket, boost::bind(&this->handle_accept, this, this->socket, NULL)); 
} 

где нет никакого списка инициализации. Любые данные из test должны быть построены до тела вашего конструктора.

Ваш конструктор должен выглядеть примерно так:

test() 
: acceptor(io_service, tcp::endpoint(tcp::v4(), 30000)) 
, socket(io_service) 
{ 
    acceptor.async_accept(socket, boost::bind(&this->handle_accept, this, this->socket, NULL)); 
} 
+0

Он исправляет ошибку, но все-таки я получил еще несколько ошибок. Один из них я вижу: ошибка: использование удаленной функции «boost :: asio :: basic_stream_socket :: basic_stream_socket (const boost :: asio :: basic_stream_socket &) ' acceptor.async_accept (this-> socket, boost :: bind (& test :: handle_accept, this, this-> socket, boost :: asio :: placeholders :: error)); –

+0

Похоже, что сокет не копируется, и вы передаете его по значению в качестве третьего аргумента 'bind'. Вам действительно нужно научиться читать эти ошибки: первая часть, которую вы вставили, является стандартной подписью конструктора копирования. – Useless