linux boost.asio 通信中遇到错误

2019-12-14  本文已影响0人  送分童子笑嘻嘻

错误
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
what(): bind: Permission denied
原因
在UNIX系统上,第一个1024端口仅限于root用户,因此如果 serverPort <1024,则应尝试> 1024
解决
将网上抄的代码中设置的端口号由1000改为8888,问题解决

错误
/usr/include/boost/system/error_code.hpp:221:对‘boost::system::generic_category()’未定义的引用
解决
add_executable(boost_server2 boost_server2.cpp)
下添加这个
add_executable(boost_server2 boost_server2.cpp)
target_link_libraries(boost_server2 -lboost_system)

真是方便,可以直接传vector
但是要通过vector.resize 提前在socket服务端配置大小,

一个可以接受vector的socket

#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char *argv[]) {
    using namespace boost::asio;
    // 所有asio类都需要io_service对象
    io_service iosev;
    ip::tcp::acceptor acceptor(iosev, ip::tcp::endpoint(ip::tcp::v4(), 8888));
    for (;;) {
        // socket对象
        ip::tcp::socket socket(iosev);

        // 等待直到客户端连接进来
        acceptor.accept(socket);

        // 显示连接进来的客户端
        std::cout << socket.remote_endpoint().address() << std::endl;
        vector<uint32_t> image;
        // 向客户端发送hello world!
        boost::system::error_code ec;

        socket.write_some(buffer("boost_server3.cpp:hello world!"), ec);
        // 如果出错,打印出错信息
        if (ec) {
            std::cout << boost::system::system_error(ec).what() << std::endl;
            break;
        }
        // 与当前客户交互完成后循环继续等待下一客户连接
        // 接收数据
        //获得宽和搞

//        std::array<int, 2> a_int2;
//        size_t len1 = socket.read_some(buffer(a_int2), ec);
//        std::cout << "a_int2.at(0)=" << a_int2.at(0) << std::endl;
//        std::cout << "a_int2.at(1)=" << a_int2.at(1) << std::endl;
//        int width = a_int2.at(0);
//        int height = a_int2.at(1);
//        vector<uint32_t> t_32;
        vector<int > t_32;
        t_32.resize(50000);
        size_t len = socket.read_some(buffer(t_32), ec);
        std::cout << len << std::endl;
//        for (int i = 0; i < t_32.size(); ++i) {
//            std::cout << t_32[i] << std::endl;
//        }
        Mat src = Mat::zeros(219, 205, CV_8UC1);
//    Mat src(600,400,CV_8UC3);
//        // 在图片的正中间增加一根红色的线条
//        for (int j = 0; j < src.cols; ++j) {
//            src.at<Vec3b>(300,j) = Vec3b(0,0,255);
//        }
        int test = 0;
        for (int i = 0; i < 205; ++i) {
            std::cout<<" " <<std::endl;
            for (int j = 0; j <219 ; ++j) {
                int Gray = t_32[i * 205 + j];
                src.at<uchar>(i, j) = (uchar)Gray;
                if (Gray > 200) {
                    test++;
                }
                std::cout<<Gray<<" " ;
            }
        }
      std::cout << "test=" <<test<< std::endl;
        imshow("dst", src);
        waitKey(0);
        destroyAllWindows();
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读