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;
}