提升插座。在格式化/重新安装Ubuntu之后,工作代码不再工作。权限问题?

问题描述:

我正在运行的Ubuntu 16.04和使用ROS kinetic(无关的这个问题)。与这个项目无关,我打破了我的系统,并决定重新安装Ubuntu。一切都很顺利,我认为我已经把我的系统重新组合在一起。所以现在我有这个代码发送一个数据包到LiDAR并解码我回来的信息。你可以看到我把几个cout的调试。程序在发送数据包并等待数据返回后冻结。这段代码现在可以正常工作几个月,并且在重新安装Ubuntu之后并没有改变。提升插座。在格式化/重新安装Ubuntu之后,工作代码不再工作。权限问题?

事情我已经尝试

sudo adduser my_username dialout 
sudo adduser my_username root 
sudo adduser my_username sudo 

我还编辑/etc/sudoers.d加我用户名在那里的所有权限。

我怀疑挂断是由于权限的原因是因为我有另一段代码使用UART通信/ dev/ttyUSB1,我必须使用sudo chmod a+rw /dev/ttyUSB1才能工作。这以前没有必要。

相关代码如下,但我强烈怀疑这不是问题。代码编译并按预期运行,除了挂机。我会很感激任何反馈和建议,我会尽我所能继续回复。

#include <iostream> 
#include <boost/array.hpp> 
#include <boost/asio.hpp> 
#include <sensor_msgs/LaserScan.h> 

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


class KeyenceLaser 
{ 
    public: 
     KeyenceLaser(boost::asio::io_service& io_service, const std::string& host, const std::string& port):io_service_(io_service), socket_(io_service, udp::endpoint(udp::v4(), 0)) 
     { 
      udp::resolver resolver(io_service_); 
      udp::resolver::query query(udp::v4(), host, port); 
      udp::resolver::iterator iter = resolver.resolve(query); 
      endpoint_ = *iter; 

      if (socket_.is_open()){std::cout<<"socket open"<<std::endl;;}else{std::cout<<"socket not open"<<std::endl;} 
     } 

     ~KeyenceLaser() 
     { 
      socket_.close(); 
     } 

     void send(const std::string& msg) 
     { 
      socket_.send_to(boost::asio::buffer(msg, msg.size()), endpoint_); 
     } 
     void poll(sensor_msgs::LaserScan::Ptr scan) 
     { 
      char request[1920]; 
          char srequest[]={0x90,0,1,0,0,0,0,0,0,0};// sends the request to get all beam data back 
      size_t request_length = strlen(srequest); 
      unsigned char reply[1920]; 
      scan->ranges.resize(953); 

      try 
      { 
std::cout<<"1 sending request"<<std::endl; 
       boost::system::error_code errcode; 
       boost::asio::socket_base::message_flags flags=NULL; 
       int bytesSent =-1; 
       bytesSent= socket_.send_to(boost::asio::buffer(srequest, 10), endpoint_); 
std::cout<<"sent " << bytesSent << " bytes\n2 waiting for data back"<<std::endl; 
       size_t reply_length = socket_.receive_from(boost::asio::buffer(reply, 1920), endpoint_); 
std::cout<<"3 got data back"<<std::endl; 

       scan->angle_min = -.090757; 
       scan->angle_max = 3.23234; 
       scan->angle_increment = 3.323106/953.0; 
       scan->range_min = 0.00; 
       scan->range_max = 5.0; 
       scan->ranges.reserve(953); 
       scan->ranges.resize(953); 
       scan->ranges.clear(); 

       for (int i=14;i < 1921; i++) 
        { 
        //std::cout << i/2-7<<":"<<(((reply[i+1]<<8) + reply[i])/1000.0) << std::endl; 
        scan->ranges.push_back(((reply[i+1]<<8) + reply[i])/1000.0); 

         i++; 
        } 

      } 
      catch (std::exception& e) 
      { 
       std::cout << "Exception: " << e.what() << "\n"; 
      } 
     } 

    private: 
     boost::asio::io_service& io_service_; 
     udp::socket socket_; 
     udp::endpoint endpoint_; 
}; 

编辑1:

我已经修改了代码如下...

std::cout<<"1 sending request"<<std::endl; 
        boost::system::error_code errcode; 
        boost::asio::socket_base::message_flags flags; 
        int bytesSent =-1; 
        bytesSent= socket_.send_to(boost::asio::buffer(srequest, 10), endpoint_ ,flags, errcode); 
std::cout<<"sent " << bytesSent << " bytes\ngot error code: " << errcode << "\n2 waiting for data back"<<std::endl; 
        size_t reply_length = socket_.receive_from(boost::asio::buffer(reply, 1920), endpoint_); 
std::cout<<"3 got data back"<<std::endl; 

,我得到错误95 - 不支持的操作,但我认为是原因我没有实例我的国旗正确(和谷歌没有帮我这么做)

编辑2:

我只是想说清楚,我认为我已经安装了所有必需的软件。如果你认为我只是想念一些图书馆,我愿意接受更多的东西。 P.S.我稍微修改了代码,并且套接字显示为打开并发送了10个字节。 LiDAR“链接”指示灯在我发送数据包之后不会闪烁(之前做过),所以我不认为数据包实际上是通过电缆接入的

因此,事实证明,此问题与Boost无关套接字。错误来自与LiDAR本身的连接。它通过我的网络连接显示为连接,但实际上并没有连接到LiDAR。在我将该方法的IPv4方法切换到Link-Local后,立即生效。感谢所有阅读并认为我的问题的人