【问题标题】:c++ boost asio: bind: Address already in usec ++ boost asio:绑定:地址已在使用中
【发布时间】:2016-01-12 15:00:08
【问题描述】:

我正在使用 c++ boost asio 来制作服务器客户端应用程序。

我遵循了here 的指导方针。

我仍然想知道为什么会得到以下结果:

./server    #ok

./client    # error

绑定:地址已经在使用中


server.cpp:

#include <ctime>
#include <iostream>
#include <stdio.h>
#include <string>
#include <boost/array.hpp>
#include <boost/asio.hpp>

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

struct UDP_Message
{
    double number;
};

int main()
{
    try
    {
        boost::asio::io_service io_service;
        udp::socket socket(io_service, udp::endpoint(udp::v4(), config::udp_port));
        UDP_Message message;
        message.number=0;
        for (;;)
        {
            udp::endpoint remote_endpoint;
            message.number=message.number+0.001;
            boost::system::error_code ignored_error;
            socket.send_to(boost::asio::buffer(&message,sizeof(message)),
            remote_endpoint, 0, ignored_error);
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

client.cpp:

#include <ctime>
#include <iostream>
#include <stdio.h>
#include <string>
#include <boost/array.hpp>
#include <boost/asio.hpp>

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

namespace config
{
    const unsigned short udp_port=1414;
}

struct UDP_Message
{
    double number;
};

int main()
{
    try
    {
        boost::asio::io_service io_service;
        boost::asio::socket_base::reuse_address option(true);
        udp::socket socket(io_service, udp::v4());
        socket.set_option(option);
        socket.bind(udp::endpoint(udp::v4(), config::udp_port));
        UDP_Message message;
        for (;;)
        {
            boost::array<char, 1> recv_buf;
            udp::endpoint remote_endpoint;
            boost::system::error_code error;
            socket.receive_from(boost::asio::buffer(recv_buf),
            remote_endpoint, 0, error);
            if (error && error != boost::asio::error::message_size)
            throw boost::system::system_error(error);
            std::memcpy(&message,recv_buf.data(),sizeof(message));
            std::cout<<message.number<<std::endl;
        }
    }
    catch (std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    return 0;
}

【问题讨论】:

  • 我真的相信任何使用 boost::asio 的人都应该通过使用裸 BSD 套接字例程来“学习套接字编程的诀窍”。
  • @TNW 都从here 得到并试图将它们分开。
  • recv_buf 数组看起来有点偏小。

标签: c++ sockets boost boost-asio


【解决方案1】:

您正在尝试将客户端和服务器绑定到同一个端口,udp_port=1414。这是你做不到的。

【讨论】:

  • 但它们必须发送和监听同一个端口
  • 如果你弄乱了服务器和客户端代码(正如其他评论所暗示的那样),我的回答是不相关的。请发布正确的代码,我会相应地编辑我的答案。
  • 如何将服务器与客户端分离?
  • 谢谢,但这不是答案。
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多