[英]Boost ASIO Tcp Client/Server object connect issue
我正在嘗試為客戶端和服務器創建一個“連接處理程序”,服務器端與其他客戶端一起工作得很好但是當我嘗試連接一個客戶端時,我總是遇到同樣的崩潰,它出現在之后socket->connect
。
這是來自客戶端的錯誤:
terminate called after throwing an instance of 'boost::wrapexcept<boost::system::system_error>'
what(): bind: Address already in use
這是我的 TCP.cpp:
TCP::TCP(TYPE type)
{
switch (type)
{
case (CLIENT):
setup_client();
case (SERVER):
setup_server();
default:
break;
}
}
TCP::~TCP()
{
_socket->close();
}
void TCP::setup_client()
{
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"), PORT);
_socket = new tcp::socket(_io_service);
_socket->connect(endpoint);
}
void TCP::setup_server()
{
_acceptor = new tcp::acceptor(_io_service, tcp::endpoint(tcp::v4(), PORT )); //listen for new connection
_socket = new tcp::socket(_io_service); //socket creation
_acceptor->accept(*_socket); //waiting for connection
}
string TCP::read_socket() {
boost::asio::streambuf buf;
boost::asio::read_until(*_socket, buf, "\n" );
string data = boost::asio::buffer_cast<const char*>(buf.data());
return data;
}
void TCP::send_socket(const string& message)
{
const string msg = message + "\n";
boost::asio::write(*_socket, boost::asio::buffer(message) );
}
還有這個 my.hpp:
#define PORT 8080
enum TYPE {
CLIENT,
SERVER
};
class TCP {
public:
TCP(TYPE type);
~TCP();
string read_socket();
void send_socket(const string& message);
protected:
private:
void setup_server();
void setup_client();
boost::asio::io_service _io_service;
tcp::acceptor *_acceptor;
tcp::socket *_socket;
};
你缺少一個 break 語句:
TCP::TCP(TYPE type) {
switch (type) {
case (CLIENT):
setup_client();
break;
case (SERVER):
setup_server();
break;
default:
break;
}
}
這意味着您的客戶端還嘗試在同一端口上打開接受器。 這通常是不允許的。
刪除大量錯誤源:
#define PORT 8383
#include <boost/asio.hpp>
#include <iostream>
using namespace std::chrono_literals;
using boost::asio::ip::tcp;
using boost::system::error_code;
struct TCP {
enum TYPE { CLIENT, SERVER };
TCP(TYPE type);
~TCP();
std::string read_socket();
void send_socket(const std::string& message);
private:
boost::asio::io_service _io_service;
tcp::socket _socket { _io_service };
tcp::acceptor _acceptor { _io_service };
};
TCP::TCP(TYPE type) {
if (type == CLIENT) {
_socket.connect(tcp::endpoint{ {}, PORT});
} else {
_acceptor = tcp::acceptor{_io_service, {{}, PORT}};
//_acceptor.bind({{}, PORT});
_acceptor.accept(_socket);
}
}
TCP::~TCP() {
if (_socket.is_open()) _socket.close();
if (_acceptor.is_open()) _acceptor.close();
}
std::string TCP::read_socket() {
std::string data;
auto n = read_until(_socket, boost::asio::dynamic_buffer(data), "\n");
data.resize(n);
return data;
}
void TCP::send_socket(const std::string& message) {
write(_socket, boost::asio::buffer(message + "\n"));
}
int main() {
std::thread server_th([&] {
TCP s(TCP::SERVER);
s.send_socket("ECHO: " + s.read_socket());
});
std::thread client_th([&] {
std::this_thread::sleep_for(10ms);
TCP c(TCP::CLIENT);
c.send_socket("Hello world!");
std::cout << c.read_socket() << "\n";
});
client_th.join();
server_th.join();
}
印刷
ECHO: Hello world!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.