boost.asio 如何避免两个客户端在同一个端口连接同一个服务器
boost.asio how to avoid two clients to connect same server at same port
我的服务器代码如下:
#include <bits/stdc++.h>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/asio/socket_base.hpp>
using namespace std;
using boost::asio::ip::tcp;
using namespace boost::asio;
using namespace boost;
int main(int argc, char* argv[])
{
io_service iosev;
ip::tcp::acceptor acceptor(iosev,
ip::tcp::endpoint(ip::tcp::v4(), 1000));
for(;;)
{
ip::tcp::socket socket(iosev);
acceptor.accept(socket);
std::cout << socket.remote_endpoint().address() << std::endl;
acceptor.bind(ip::tcp::endpoint(ip::tcp::v4(), 1000));
boost::system::error_code ec;
std::string message;
while (std::cin>>message) {
socket.write_some(buffer(message), ec);
if (*(message.end()-1)=='@') break;
}
if(ec)
{
std::cout <<
boost::system::system_error(ec).what() << std::endl;
break;
}
}
return 0;
}
我的客户端代码如下:
#include <bits/stdc++.h>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/asio/socket_base.hpp>
using namespace std;
using boost::asio::ip::tcp;
using namespace boost::asio;
using namespace boost;
int main(){
try
{
boost::asio::io_service io;
tcp::socket socket(io);
tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 1000);
socket.connect(end_point);
for (;;)
{
boost::array<char, 128> buf;
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (error == boost::asio::error::eof)
{
break; //connection closed cleadly by peer
}
else if (error)
{
throw boost::system::system_error(error); //some other error
}
cout.write(buf.data(), len);
cout<<"\n";
}
}
catch (std::exception& e)
{
cout<<e.what()<<endl;
}
std::system("pause");
}
如果我运行服务器一次并打开两个将设置为连接“127.0.0.1:1000”的客户端,第一个打开的客户端工作正常,但第二个打开的客户端无法接收服务器函数发送的任何内容write_some(...) 并且第二个打开的客户端没有收到任何错误(似乎它总是在等待某些东西)。为什么?
我怎样才能更改编程代码让客户端在连接到已被另一个客户端连接的 server:port 时获得 errors/exceptions?
当第二个连接进入时,您的服务器正在处理第一个连接。尽管操作系统中的网络层接受了第二个连接,但您的程序无法处理它。
这就是为什么网络服务器必须能够同时处理多个请求,例如通过为每个传入连接创建一个线程,以便主(侦听)线程准备好处理下一个传入连接。
我的服务器代码如下:
#include <bits/stdc++.h>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/asio/socket_base.hpp>
using namespace std;
using boost::asio::ip::tcp;
using namespace boost::asio;
using namespace boost;
int main(int argc, char* argv[])
{
io_service iosev;
ip::tcp::acceptor acceptor(iosev,
ip::tcp::endpoint(ip::tcp::v4(), 1000));
for(;;)
{
ip::tcp::socket socket(iosev);
acceptor.accept(socket);
std::cout << socket.remote_endpoint().address() << std::endl;
acceptor.bind(ip::tcp::endpoint(ip::tcp::v4(), 1000));
boost::system::error_code ec;
std::string message;
while (std::cin>>message) {
socket.write_some(buffer(message), ec);
if (*(message.end()-1)=='@') break;
}
if(ec)
{
std::cout <<
boost::system::system_error(ec).what() << std::endl;
break;
}
}
return 0;
}
我的客户端代码如下:
#include <bits/stdc++.h>
#include <boost/asio.hpp>
#include <boost/array.hpp>
#include <boost/asio/socket_base.hpp>
using namespace std;
using boost::asio::ip::tcp;
using namespace boost::asio;
using namespace boost;
int main(){
try
{
boost::asio::io_service io;
tcp::socket socket(io);
tcp::endpoint end_point(boost::asio::ip::address::from_string("127.0.0.1"), 1000);
socket.connect(end_point);
for (;;)
{
boost::array<char, 128> buf;
boost::system::error_code error;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (error == boost::asio::error::eof)
{
break; //connection closed cleadly by peer
}
else if (error)
{
throw boost::system::system_error(error); //some other error
}
cout.write(buf.data(), len);
cout<<"\n";
}
}
catch (std::exception& e)
{
cout<<e.what()<<endl;
}
std::system("pause");
}
如果我运行服务器一次并打开两个将设置为连接“127.0.0.1:1000”的客户端,第一个打开的客户端工作正常,但第二个打开的客户端无法接收服务器函数发送的任何内容write_some(...) 并且第二个打开的客户端没有收到任何错误(似乎它总是在等待某些东西)。为什么? 我怎样才能更改编程代码让客户端在连接到已被另一个客户端连接的 server:port 时获得 errors/exceptions?
当第二个连接进入时,您的服务器正在处理第一个连接。尽管操作系统中的网络层接受了第二个连接,但您的程序无法处理它。
这就是为什么网络服务器必须能够同时处理多个请求,例如通过为每个传入连接创建一个线程,以便主(侦听)线程准备好处理下一个传入连接。