首页 > 解决方案 > 向其他方向发送消息时“需要目标地址”

问题描述

我有客户端和服务器应用程序。他们使用 udp 套接字进行通信。

我可以从客户端发送一些消息并在服务器上接收它。但我无法向其他方向发送消息。

我修改客户端服务器增强示例。

我的服务器:

#include <cstdlib>
#include <iostream>
#include <string>
#include <boost/asio.hpp>

using boost::asio::ip::udp;

enum { max_length = 1024 };

int main(int argc, char* argv[]) {
    try {
        if (argc != 2) {
            std::cerr << "<port>\n";
            return 1;
        }

        boost::asio::io_context io_context;
        int port = std::atoi(argv[1]);
        udp::endpoint endpoint(udp::v4(), port);
        udp::socket *socket = new udp::socket(io_context, endpoint);

        std::cout << "starting loop\n";
        while(true) {
#ifdef GOOD_RIRECTION
            char data[max_length];
            size_t len = socket->receive(boost::asio::buffer(data, max_length));
            std::cout << "Recieved: "<< std::string(data, len) << '\n';
#else

            std::cout << "Enter message: ";
            char request[max_length];
            std::cin.getline(request, max_length);
            size_t request_length = std::strlen(request);
            socket->send(boost::asio::buffer(request, request_length));
#endif
        }
    } catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}

我的客户:

#include <cstdlib>
#include <cstring>
#include <iostream>
#include <boost/asio.hpp>

using boost::asio::ip::udp;

enum { max_length = 1024 };

int main(int argc, char* argv[]) {
    try {
        if (argc != 3) {
            std::cerr << "<host> <port>\n";
            return 1;
        }

        boost::asio::io_context io_context;

        udp::socket *socket = new udp::socket(io_context);
        udp::resolver resolver(io_context);
        udp::resolver::results_type endpoints =  resolver.resolve(udp::v4(), argv[1], argv[2]);
        socket->connect(*endpoints.begin());

        std::cout << "starting loop\n";
        while (true) {
#ifdef GOOD_RIRECTION
            std::cout << "Enter message: ";
            char request[max_length];
            std::cin.getline(request, max_length);
            size_t request_length = std::strlen(request);
            socket->send(boost::asio::buffer(request, request_length));
#else

            char data[max_length];
            size_t len = socket->receive(boost::asio::buffer(data, max_length));
            std::cout << "Recieved: "<< std::string(data, len) << '\n';
#endif
        }
    } catch (std::exception& e) {
        std::cerr << "Exception: " << e.what() << "\n";
    }
    return 0;
}

在哪里GOOD_RIRECTION定义一切正常。

如果不是 - 我send: Destination address required在第一次发送时遇到异常。

据我了解,套接字是独立于方向的,所以我在建立连接期间做了一些事情。但我无法理解究竟是什么。

更新: 从评论中我了解到 udp 中没有“连接”。

我构建了我的客户端两次(有和没有GOOD_RIRECTION定义)。我尝试使用一个发送消息和另一个接收。在这种情况下,我没有收到第一条消息并send: Connection refused继续发送第二条消息。

标签: c++socketsboostudpboost-asio

解决方案


推荐阅读