这不是重复的! (这不是UDP,它是TCP。这不是C#,Python或其他什么,它是C ++)
如果我尝试通过外部IP连接,则会收到标题中描述的错误。但是,它通过" localhost"或" 127.0.0.1" (我在同一台机器上运行client.exe和server.exe)。这段代码是从一个例子中复制过来的,我做了一些小改动。
编辑:我为两个可执行文件授予了防火墙权限。但问题仍然存在。
服务器:
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
std::string make_daytime_string()
{
using namespace std; // For time_t, time and ctime;
time_t now = time(0);
return ctime(&now);
}
int main()
{
try
{
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 62000));
for (;;)
{
tcp::socket socket(io_service);
acceptor.accept(socket);
std::string message = make_daytime_string();
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
客户端:
#include <iostream>
#include <boost/array.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
int main(int argc, char* argv[])
{
try
{
boost::asio::io_service io_service;
tcp::resolver resolver(io_service);
tcp::resolver::query query("localhost", "62000");
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
tcp::endpoint endpoint = *endpoint_iterator;
std::cout << endpoint << "\n\n";
tcp::socket socket(io_service);
boost::asio::connect(socket, endpoint_iterator);
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 cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
std::cout.write(buf.data(), len);
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
std::cout << "\n\n";
system("pause");
return 0;
}
答案 0 :(得分:3)
事实证明,如果请求来自我的本地网络,我的路由器将无法接受来自互联网的连接(使用外部IP)。
只要请求不是来自我的本地网络,客户端就会毫无问题地连接到服务器。
如果我想在我的机器上运行客户端和服务器,我必须使用我的内部IP(127.0.0.1或我的内部网络IP)。
如果其他人想要从我的本地网络外部连接到我的服务器,它将正常工作。但是我本地网络内的机器无法使用外部IP访问服务器,只能使用内部IP。
我从未见过这种情况。但至少它不会影响我的程序的功能。