我的服务器代码如下:
#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(...)发送的任何内容。第二个打开的客户端没有收到任何错误(它似乎总是在等待某些东西)。为什么?如何更改编程代码,使客户端在连接到已由另一个客户端连接的服务器端口时出现错误/异常?
发布于 2020-10-21 15:41:23
当第二个连接进入时,您的服务器正在处理第一个连接。尽管操作系统中的网络层接受了第二个连接,但您的程序无法处理它。
这就是为什么必须建立网络服务器,以便它们可以同时处理多个请求,例如,通过为每个传入连接创建一个线程,以便主(侦听)线程准备好处理下一个传入连接。
https://stackoverflow.com/questions/64446832
复制相似问题