遇到的问题集合(倒序)
遇到的问题集合(倒序)
- 7.Qt跨线程访问对象以及QMainWindow的父对象
- 6.QString 到 char * 中文复制的一个问题
- 5.信号处理的一个问题
- 4.(已解决)非阻塞套接字遇到的一个问题
- 3.(已解决)使用pcap发送arp遇到的一个字节对齐问题
- 2.(未解决)远程调试Linux,找不到libnss_dns.so.2和libresolv.so.2
- 1.第一条太菜了删掉了
7.Qt跨线程访问对象以及QMainWindow的父对象
有两个问题第一个问题是在qt里,两个继承自QMainWindow的窗口类A和B,有对象A1、B1当我试图在A1的构造函数里:B1 = new B1(this);在B的构造函数里,可以通过参数parent取得A1对象,但是当我尝试在B1的另一个成员函数里使用parent()成员函数取得父对象时,其返回值总是空指针也许是QMainWindow对象不应该有父对象?查了查也没找到查看QMainWindow的定义,也没看到复写parent成员函数,另一个parentwidget函数也只是调用parent而已。最后不得不在B类里添加一个成员指针,指向A类的对象。第二个问题是跨线程访问QT对象的需求:在一个异步线程里,从网络上拉取好友列表,然后创建QListWidgetItem条目,把这些条目添加到QListWidget中同时更新ui的进度条陷入两难境地:如果同步执行:那么该窗口的show调用会被阻塞,直到把这些条目都添加进去,并且更新进度条之后才会显示窗口,也就是说看不见进度条的更新了如果异步执行:输出窗口里会显示Cannot set parent, new parent is in a different thread之类的报错,大意就是不在同一个线程操作是禁止的解决方法参考自:https://blog.csdn.net/u012321968/article/details/108214644invokeMethod这个方法,会把第二参数的函数,放到第一参数对象所在的线程执行整个函数还是异步执行的,只不过在这个函数里跨线程操作对象的部分,使用invokeMethod包裹了起来for (auto it : MdFriendList){ QMetaObject::invokeMethod(ui.listWidget,[=](){QListWidgetItem* Item = new QListWidgetItem();FriendItemClass* widget = new FriendItemClass();widget->ui.label->setText(it.second.c_str());widget->ui.label_2->setText(QString::fromLocal8Bit(" 离线"));Item->setSizeHint(widget->minimumSizeHint());ui.listWidget->addItem(Item);ui.listWidget->setItemWidget(Item, widget);});}
6.QString 到 char * 中文复制的一个问题
问题出现:从qt控件获取输入的一个中文字符串,然后使用strncpy复制到char * 的问题,当字符串没有中文就不会出现,有中文就出现原来有问题的代码char dst[100];int size = ui.lineEdit_4->text().toLocal8Bit().length();strncpy(dst, ui.lineEdit_4->text().toStdString().c_str(), msg.size );测试:控件ui.lineEdit_4输入四个汉字,size为8(打印出来验证过),strncpy后,再打印dst,就会出现乱码一开始以为编码问题,尝试过ui.lineEdit_4->text().toUtf8() ui.lineEdit_4->text().toLatin1()以及其他各个和字符集相关的text()成员函数,总是有乱码但是直接打印ui.lineEdit_4->text().toStdString().c_str()就没有问题尝试打印ui.lineEdit_4->text().toStdString().length();同样四个汉字ui.lineEdit_4->text().toLocal8Bit().length(); 的值是8ui.lineEdit_4->text().toStdString().length(); 的值是12多次验证后,确实如此直接打QT印控件的字节数一个汉字2字节,转成std::string后每个汉字占了3字节没有问题的代码char dst[100];int size = ui.lineEdit_4->text().toStdString().length();strncpy(dst, ui.lineEdit_4->text().toStdString().c_str(), size);
5.信号处理的一个问题
在link.的对SIGPIPE信号的处理是危险的,详见本问题最后的截图,该截图来自我的另一篇文章。
关于信号的处理内容见第二张图,第一张图中被注释掉的是原来的代码。
关于SIGPIPE的处理,一开始是替换处理过程,后来又改成SIG_IGN,但是SIG_IGN到底算不算一个《信号处理程序》不得而知,也懒得去测了,而且当下这个情况,对SIGPIPE也没有处理的必要,最后就改成了直接阻塞掉它。
4.(已解决)非阻塞套接字遇到的一个问题
一开始想使用非阻塞套接字来进行传输,通过unp第16章描述,如下:
主要问题是:
对于recv,在接收缓冲区没有数据时,EWOULBLOCK错误
对于send,在发送缓冲区满时,EWOULBLOCK错误
书中描述的语义大概是recv和send的返回EWOULBLOCK,导致我一度使用EWOULBLOCK == recv(sock, buf, 1, 0)
来判断,但实际上是recv和send返回-1,而后通过errno来判断:
if( 0 >= recv(sock, buf, 1, 0)if(EWOULBLOCK == errno)...
问题发现过程:在接收端打印recv返回值时,出现了有时返回-1,但是连接并未断开,随后有继续收到数据的情况,通过将errno转换为错误信息后得到:Resource temporarily unavailable。之后在链接.中找到答案: 该链接中的描述解决书中的误导。
另外,在最后的测试中,recv在接收缓冲区空的情况下成功判定到了EWOULBLOCK,但是在send发送缓冲区塞满的情况下,send返回了-1值,errno值却是0
2020年9月19日19:17
今天早上突然想起来,recv是在linux测得,send是在win上测的,怪不得结果不一样,经过刚刚验证后,互换平台代码,得出最终结论:
linux平台:非阻塞套接字,send在发送缓冲区满 和 recv在接收缓冲区空时,返回-1,errno被设置为EWOULBLOCK(11)
win平台:非阻塞套接字,send在发送缓冲区满 和 recv在接收缓冲区空时,返回-1,errno值为0
2020年9月20日07:27
3.(已解决)使用pcap发送arp遇到的一个字节对齐问题
刚才使用pcap发送一个arp包,用wireshark抓包,抓的包和预期对不上。
其中源MAC IP、目的MAC IP,只有源MAC是正确的,确信填写的代码没有出错。
目的MAC填全0,但是抓到的包是01-07-00-00-00-00。后来阴差阳错试着把源mac也填到目的mac上试试是个什么情况,抓到如下包:
情况已然有些明了,从源IP字段开始,所有数据之前都被偏移了两个字节。比如源IP地址那里,源IP应该是192.168.1.7,但是1.7却偏移到了目的MAC的位置,而目的mac地址也依次偏移了两个字节。
开始检查定义ARP包的结构:
首先确定了IN_ADDR结构是4字节:
接下来查看整个结构,如以下图1,结构各个成员加起来应该是28字节,但是sizeof出来却是32字节(2+2+1+1+2+6+4+6+4)。
接着我删掉了,源IP和目标IP字段,如图2,这时sizeof之后只有20字节,之前已经确认过IN_ADDR是4字节,删掉了两个IN_ADDR结构却减少了12字节,此时已经确定是字节对齐的问题了:
最后,通过调整成员顺序(图三)或者合并字段(图四),解决字节对齐,sizeof的结构长度已经是28字节(一个arp包长度)了,之后发送的ARP请求包,也在wireshark中抓到了回复包:
2020年8月19日15:16
2.(未解决)远程调试Linux,找不到libnss_dns.so.2和libresolv.so.2
今天看完unp第11章,想着测试一下gethostbyname和getservbyname,但是远程调试(云服务器)的时候,只要一进入这两个函数,就会断点,然后报如下错,找不到libnss_dns.so.2和libresolv.so.2。接着我把这份代码放到本地的一个虚拟机上跑,可执行文件生成了,但是执行的时候,提示大概也是找不到库之类的,也没找到安装他们的方法。截图:
2020年7月19日23:02:11
1.第一条太菜了删掉了
遇到的问题集合(倒序)相关推荐
- java iterator如何倒序输出
iterator只能向前迭代 List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,ListIt ...
- 我是怎么跟面试官聊Map集合的
我习惯了无所谓,却不是真的什么都不在乎. 请关注:源码猎人 目录 简介 Map 框架 Map 接口源码解读 Map 内部类Entry接口源码 AbstractMap 抽 ...
- 步步为营VS 2008 + .NET 3.5系列文章索引
介绍 步步为营VS 2008 + .NET 3.5系列文章索引:VS 2008新特性.C# 3.0新特性.LINQ查询操作符.DLINQ(LINQ to SQL).XLINQ(LINQ to XML) ...
- Freemarker的基本语法及入门基础
freemarker的基本语法及入门基础 一.freemarker模板文件(*.ftl)的基本组成部分 1. 文本:直接输出的内容部分 2. 注释:不会输出的内容,格式 ...
- Redis学习(6)-常用命令
List命令 value值为LinkedList类型. 使用环境: 1,做大数据集合的增删. 2,任务队列.用户任务队列 链表查看 lrange key start end:获取链表从start到en ...
- java-Map接口
Map接口的概述和使用 -概述:public interface Map<K,V> -特点:*将键映射到值的对象 *一个映射不能包含重复的键 ...
- 一些Linq方法,come on !!
bool b1 = users.All(u => u.ID == 21); 判断是否元素都满足条件,如果有一个不满足,则返回False,都满足则返回True Any() bool b2 = us ...
- Elasticsearch初步学习(仿京东搜索、爬虫)
个人博客欢迎访问 微信搜索程序dunk,关注公众号,获取项目.博客源码 我们面前无所不有,我们面前一无所有 --查尔斯·狄更斯 序号 内容 1 Java基础面试题 2 JVM面试题 3 Java并发编 ...
- Spring Boot学习之旅:(六)springboot 整合 redis 以及 redis 通用工具类
这编文章主要介绍了springboot整合redis,以及redis配置和一些redis操作数据的工具类. 首先倒入redis依赖 一.依赖 <dependency><groupId ...
- 【Groovy】集合遍历 ( 使用集合的 reverseEach 方法进行遍历 | 倒序集合迭代器 ReverseListIterator 类简介 | 代码示例 )
文章目录 一.使用集合的 reverseEach 方法进行倒序遍历 二.倒序集合迭代器 ReverseListIterator 类简介 三.代码示例 一.使用集合的 reverseEach 方法进行倒 ...
最新文章
- 镜像打包工具clonezilla
- 学软件测试的优势有哪些
- Java并发——ReentrantLock
- CentOS7路由、端口和服务排障常用命令
- 在HTML文件中加载js
- centos php.ini redis,CentOS下安装Redis及Redis的PHP扩展
- 数据结构之单向环形列表解决josef问题
- java给腾讯通发消息_通过web 向rtx发送通知消息
- 微软提出VLMo:用“模态混合专家”进行统一的视觉语言预训练!即将开源!
- linux释放内存后设备起不来,Linux-Memory小记
- delphi 停电文本数据丢失_河南照片数据恢复怎么联系
- WampServer下使用PHP
- 调用css样式是不调用某个属性,CSS选择器可以引用另一个选择器属性吗?
- 阶段3 1.Mybatis_12.Mybatis注解开发_1 mybatis注解开发的环境搭建
- 史上最全进入BIOS方法及U盘重装系统步骤详解
- View 5应用之二:瘦客户机上的虚拟桌面
- 电子计算机off键是什么意思,off键是什么意思
- Java面试必问的HashMap,基础mysql笔试题及答案
- 生活随记-剪纸与父子
- 面试产品经理时如何回答“为什么想做产品经理”这个问题
热门文章
- 今天中午吃什么转盘html,吃到撑的几种简单午饭,让你再也不发愁吃什么了!...
- cdr圆形渐变填充怎么设置_CDR渐变填充实例教程
- 计算机专业的学生也太太太太太惨了吧?
- 科研绘图,看这一篇就够了(内含免费送书活动)
- 【论文翻译】Class-Incremental Few-Shot Object Detection
- 【Spark】(task4)SparkML基础(数据编码)
- WIN 10 系统Alt + Tab 切换窗口卡顿问题结局方案
- 标准二维表问题 (卡特兰数)
- 使用Matplotlib美化和修饰图形
- Windows2012开机启动项设置