❌

普通视图

Obsidian 笔记同步插件-Fast Note Sync For Obsidian

作者 老张
2026年8月22日 15:47

写博客的博友们十有八九都折腾过笔记软件,笔记软件我是折腾了不少,现在主力是obsidian,Trilium做备份!不是备用,而是备份用!前段时间不是薅了小米mimo的羊毛嘛,写了一个obsidian插件,自动同步内容到Trilium,以后想用Trilium也不需要做数据迁移了。而Obsidian在使用过程中最大的问题就是数据同步了,2023年的时候,我就使用《Obsidian多端同步终极大法Syncthing、备份终极大法Kopia》,Syncthing确实是个好东西,有兴趣的可以折腾下。

今天的主角是Fast Note Sync For Obsidian,是一款Obsidian同步插件,但是它还需要在VPS来部署服务端。官方介绍是”快速多端同步、自动备份、版本可追溯,可分享协作的 Obsidian 笔记同步插件”,我认为最大的亮点就是”可分享协作”!项目地址是https://github.com/haierkeys/obsidian-fast-note-sync,有兴趣的可以看看。

Fast Note Sync的功能不再赘述了,项目介绍的非常详细了。如果你正在使用Obsidian而同时又有自己的VPS,那我认为Fast Note Sync是obsidian最完美的多端同步方案,没有之一!

{riven_notice type=”red”}补充下吧:我认为最为完美的地方就是WEB管理笔记,可以通过反代的域名进行对obsidian笔记的增、删、改、查!也就是把obsidian变成了web版!{/riven_notice}

终结者2:审判日

作者 大致
2026年6月18日 20:14

终结者2:审判日

童年阴影系列,微笑继续。
Terminator2_Judgment_Day_000
几年前说《摩登原始人2》 的时候,提到过当时有盘四合一。这次说的是这盘四合一中一个非常不好玩、确切的说是难到玩不下去的游戏:《终结者2》
Terminator2_Judgment_Day_003
Terminator2_Judgment_Day_005

这是个又难又不好玩的游戏。除音乐和画面之外乏善可陈。
最大的不爽的点是攻击距离近,而打在敌人身上既没有硬直也不产生音效,敌人的攻击也没什么前摇,往往这边拳头挥得上瘾,那边血量已经见红了。这种感觉有点像《成龙踢馆》被敌人黏身上,血刷刷掉。
其实第一关倒还好,保持耐心,hit and run,清光敌人就能过关,不算太难。
Terminator2_Judgment_Day_009

第二关是真正的噩梦。卡车在身后追,你骑个摩托在前面跑,斜向卷轴又快又猛,还有关卡和路障。真的是“前有追兵后有堵截”[5]。
想过关,需要在短时间内对着前方正中的铁丝网连开3枪打出窟窿,并保证躲过路障后能从窟窿中钻过去。后面的卡车撞一次差不多1/3的血槽就没了。我真讨厌这样考验手速和操作准确性的关卡。
这次重温才知道,那个子弹可以往后打,打中卡车可以让它一时退却。试了一下发现完全没卵用,斜45°的后方一点儿也不好操作。
Terminator2_Judgment_Day_013

从头再来。手感软绵绵的第一关不咬人膈应人,越打兴致越低。
于是就到此为止了。虽然是自己买的卡,却从没见过第三关。
Terminator2_Judgment_Day_010
Terminator2_Judgment_Day_011

如今,上了手段后终于能往后走了。发现后面的第四关也很坑,是个流程很长的在一栋大楼里找炸弹安炸弹的过程。找炸弹一次最多找两颗,放到顶楼的房间,找齐10颗炸弹后再从那个房间里把炸弹取出来埋到指定位置,一次最多埋2颗,10颗炸弹全部埋完后过关。敌人无穷无尽,子弹有限,找炸弹没有时间限制,安炸弹却有很严格的限时,容错率很低。这个设定很令人费解:你找到炸弹直接去给埋上能耽误什么事儿啊,集中到一块儿埋是就是为了为难我呗?(好像是为了忠于电影发生NPC挂掉的剧情)
好在如果timeout的话,继续把没埋上的炸弹放下去就行,不用从头开始。拿命填能解决的事儿就不叫事儿。
Terminator2_Judgment_Day_014
Terminator2_Judgment_Day_016

最后一关,一看场景就知道该怎么打了:最终BOSS T-1000是打不死的,要把它推到炼钢炉里才行。要说本作最大的优点就是忠于电影了。前面那个恶心的第二关也是为了重现那场经典的排水渠追逐战。
本作的标题意思也是终结者2电影的游戏版,而不是终结者1游戏的续作。
Terminator2_Judgment_Day_018
Terminator2_Judgment_Day_019

通关。
Terminator2_Judgment_Day_020
Terminator2_Judgment_Day_021
Terminator2_Judgment_Day_022


  • (1):阿肆的成名作:《我在人民广场吃炸鸡》
  • (2):后海大鲨鱼主唱
  • (3):万能青年旅社代表作《杀死那个石家庄人》
  • (4):老婆有影院次数卡,看啥都20。
  • (5):韩乔生语录

差点又买了一台机器

作者 大灰
2026年5月22日 23:52
星期天休息,看了一下机器硬盘又快炸了,有点头大,记得去年这个时候硬盘也是爆满了,就是这么巧合。 一直有关注某家的机器,一直没入手,关键是丢数据搞的闹心了。今天鬼使神差买了这家的机器,买完真是满心欢喜,不用再次担心硬盘不够用,现实却是啪啪打脸,装了一个MariaDB,竟然耗时3个多小时!居然不如RN、CC,硬盘看着可以处理器是真辣鸡,本来不打算退的,内心还是接受不了。果断联系客服退款,一切顺利钱拿到手,再也不买这家了。 瓦工的机器最后才发现是我开启了统计,结果日志就占用十几G,我去,这玩意开启真的要设置好期限,到期清除。忘了就跟我一样硬盘爆满,一头雾水…… wordpress 7.0都发布了,从 […]

超级马里奥全明星

作者 大致
2026年4月29日 23:28
Z2FtZV8wMDAwMDAwMDE4NTU5LmpwZw==
原名:Super Mario Collection / Super Mario All-Stars / スーパーマリオコレクション机种:SFC厂商:任天堂类别:ACT发行年月:1993-07耗时:11remake

Super_Mario_Collection_000

新来的99年的小孩,竟然是个古早游戏爱好者。闲聊间自然而然地提到了《超级玛丽》(SMB1)。她表示:“《超级玛丽》好玩是好玩,就是太简单了。要是设计点更难的关就好了。”
我立即表示:“有啊,日版超级玛丽2(金牌玛丽)完全符合你要求。”
随即开始心虚——这个游戏并没有真正上手,只是存在于录像里的难——万一它没那么难,我可就难看了。
那就比划比划呗。
Super_Mario_Collection_020

为此我选中的是1993年老任为了纪念红白机发售10周年而在超任上推出的《超级马里奥合辑》(美版名《超级马里奥全明星》)。这部良心复刻[2]重制了红白机时代超级马里奥兄弟系列的3代共4部作品。
众所周知[3],红白机的超级玛丽2代分为日版的金牌玛丽和美版的拔萝卜,这是两个完全不同的游戏。
Super_Mario_Collection_027

金牌玛丽发行在磁碟机上,此前完全没接触过;拔萝卜真机虽然没见过,但是GBA模拟器出来的时候玩过几关《超级马里奥Advance》,不到2小时便放弃。这一个半是尝鲜,是此次的重点。
所以先简单说两句伟大的SMB1和SMB3。


Super_Mario_Collection_001

SMB1的影响力毋庸置疑,是红白机游戏甚至是电视游戏的代名词——自本博开博以来,18位朋友19次在留言中留下过“超级玛丽”。
因为我的小众病,若不是沾了它傻弟弟的光,再写300个红白机游戏也轮不到这款头号名作。
SMB1小时候我并不能打通关,8-4死活过不去,哪怕之前攒了十几条命,也会在见库巴前的水里变小,然后被库巴丢斧头砸死或者一腚坐死。
进入模拟器时代之后当然是第一时间报仇雪耻。在8-4开始的地方存个档,第一天没过,第二天一把就过了,真就没读第二次。从那以后我知道了,我技术也许没那么差,但是耐力和心理素质是真不太好。
Super_Mario_Collection_008

SMB1的重制版本并不多。除原版和本作外,就只GBC上还有一个版本,其余的都是没有任何变化的原版移植。
SFC这版音画大大提升,赏心悦目,心旷神怡,可以说是想重温SMB1的不二之选。
Super_Mario_Collection_003

因为不是重点,用连跑带颠的逃课打法,十几分钟就通关了。
Super_Mario_Collection_007

SFC版还给追加了一个通关画面。
Super_Mario_Collection_011

不过不知道是心理作用还是年纪大了手头反应慢,感觉SFC的起跳下蹲比起红白机版粘滞,按键节奏跟30年前是不大一样的。
这次查资料还搞清了一个困扰我30多年的问题:为什么2-1、4-1、5-1等处的奖励蘑菇,跳关打就出现,而正常一关一关打就不出现呢?
原来奖励蘑出现的真正条件是前一大关的第三小关达成金币全吃。跳关的时候等同于金币全吃,奖励蘑才会必然出现。
Super_Mario_Collection_005


Super_Mario_Collection_042

SMB3我接触的很晚,是高二(1997年)的十一。几天假忘了,反正玩游戏的时间满打满算不到2天。因为有电软上的翻牌秘技助力,加上第三世界不费吹灰之力就能把命加满,所以第一天胡搞瞎搞就打到了第八世界。
Super_Mario_Collection_063

第二天随便瞎按,发现我手上是个用SELECT就能选择所有道具的改版。但是彼时我并没有一鼓作气打通关,反而是逐一小关使用P云,妄图顶翻每一块砖头,踩遍每一个音符。沉湎在探索的乐趣中无法自拔,以至于卡还了,游戏没通关。
Super_Mario_Collection_051

SMB3是红白机的动作游戏巅峰之作,充满了乐趣,建立了后续30多年里马里奥正统系列的基本模型,是多个游戏榜单上的红白机最佳游戏。但我心目中它可不是满分。因为它有个巨大的缺陷:如此丰富的内容,竟然不支持存档,也没有密码续关。一觉醒来又要从头开始的感觉太糟了。不晓得有多少人跟我一样,前三个世界从从容容游刃有余,后面几个世界匆匆忙忙连滚带爬。
Super_Mario_Collection_048

直到2004年,出差期间,在3P哥的GBA上用FC模拟器才打了通关。
这次重温又过了20多年,感觉仍旧亲切且趣意盎然。“回来了,一切都回来了”,另外三个游戏加一起也不如SMB3玩的时间长。
Super_Mario_Collection_046

GBA上的A4也是个不错的版本,但这一版的优点是跟合集里的一代风格统一,传承有序。
Super_Mario_Collection_055
Super_Mario_Collection_059
Super_Mario_Collection_061


Super_Mario_Collection_002

拔萝卜这个救火队员,无訾无誉,温吞水。
Super_Mario_Collection_031

它放在合集里显得有些格格不入:别人消灭敌人都是靠踩、顶和扔子弹,而它却是拔和砸;别人高跳要靠加速跑,而它要靠长按蓄力。
Super_Mario_Collection_030

拔萝卜流程很长,打法却很单调。除了一些BOSS战还能有点花样,探索可谓毫无乐趣。玩到后面都犯困了。
Super_Mario_Collection_029
Super_Mario_Collection_033

优点是给各色各样的敌人起了可可爱爱的名字,比如粉色恐龙比尔多,可能是这一作在系列中留下的唯一遗产。
Super_Mario_Collection_035
Super_Mario_Collection_036
Super_Mario_Collection_041


Super_Mario_Collection_012

最后是正主金牌玛丽。难确实是难,但最直观的感受还不是难,而是“恶心”,充斥着对于玩家的恶意。相对于一代新增的要素:吃掉后大变小小变无的黑蘑菇;被靠近后不会缩回的红色食人花;跳到空中超长待机不知道什么时候才会落下的绿弹簧;在空中漂浮的章鱼;从友商借鉴来的空中的风和地上的冰——没有一样是对攻关过程有正向作用的。连续出现的极限跳跃、糖葫芦串食人花红乌龟什么的是家常便饭。
Super_Mario_Collection_019

最为人诟病的还是对于探索行为的嘲讽:当你兴奋地发现一条隐藏路径,以为找到了通往后续世界的捷径,谁知获得的却是巴掌呼脸:通往第一世界。然后管子旁边还人性化地给你留了个自杀用的坑,预判了你的预判。
Super_Mario_Collection_017

第二次,直接不装了,进退不得,只能耗时间等死。
Super_Mario_Collection_021

往好了想呢,这是磁碟机游戏,开发者在善意地提醒玩家:“磁碟机能存档啊,你傻站着干什么,赶紧体验我们的读档功能啊!”
另一个开发者玩弄玩家的例子是一代中只出现过3次的迷宫,金牌玛丽里屡见不鲜。甚至后面还有一关,同样一个场景连续出现4次,让你跑得心里慌慌的,终于忍不住,尝试钻一下管子吧——然后时间就不够了。你还说你不是故意的?
在本合集中,制作者也知道自己当年的不地道,从善如流删除了把8-4通关8次才能出现后面ABCD隐藏世界的恶心设定。并且还贴心地追加了一个自杀秘技= =
Super_Mario_Collection_018

因为跟一代玩法几乎没有任何区别,所以金牌玛丽在系列里唯一的亮点是路易吉有了自己不同于马里奥的个性,“脚滑的路易吉”成为独当一面的存在。
这次我打也是选了路易吉,脚滑的缺点可以用反复读档抵消,但是蹦的高带来的好处却是实打实的。挺好用。
Super_Mario_Collection_014

游戏流程难得要死,BOSS跟一代差别却不大,除了多了串糖葫芦。
Super_Mario_Collection_024
Super_Mario_Collection_026

这部复刻合集作品最终在SFC销售榜上高居第二,我看来实至名归。哪怕是冲着音画全面加强的一代和能存档的三代,已经值回成本。另外俩纯白饶。


  • (1):中西和天龙是当年流行的两种不同的游戏币,二者厚度和重量略有差异。
  • (2):2008年老任把这部复刻版在wii上又复刻了一遍,叫做25周年纪念版,良心复刻有了自己的没良心复刻。
  • (3):金牌玛丽为磁碟机设计,特别的难。在北美发售前被紧急叫停。找来一个叫“梦工厂”的游戏换皮成马里奥中的人物,作为美版SMB2发售。后来美国人把日版马里奥2叫做“失落的关卡”,日本人把美版马里奥2叫“马里奥USA”
《超级马里奥全明星》采用署名-非商业性使用-禁止演绎许可协议进行许可。 『破袜子』期待与您交流。

WordPress Studio:官方出品的本地开发神器

作者 老王
2026年4月26日 10:19
XAMPP配置繁琐,MAMP免费版功能阉割,LocalWP启动缓慢——传统 WordPress 本地开发工具的痛点,让不少开发者头疼。WordPress官方推出的Studio彻底改变了这一局面:几秒钟创建站点、无需配置环境、支持临时预览链接分享、内置AI助手,完全免费开源。本文详细介绍Studio的核心功能与使用体验,帮你判断它是否值得成为你的下一款本地开发工具。

无人岛物语

作者 大致
2026年3月25日 23:10
Z2FtZV8wMDAwMDAwMDE4NTMzLmpwZw==
原名:無人島物語 / Mujintou Monogatari机种:SFC厂商:KSS类别:AVG发行年月:1996-01耗时:22
Mujintou_Monogatari_000
秘技:开始游戏给主人公起名【いけサラ】,则游戏开始后所有角色能力值全满,并且有近乎无限的食物和水。
本作是当年闻名遐迩的小黄油,标题这几个字就令人浮想联翩,可能是同类题材的开山之作。大概在初中时期就一直惦记了,终于花时间啃了下来,成为继GBA《黄金太阳》之后又一个玩了后悔的名作。
Mujintou_Monogatari_029

失望之处主要在于其主线玩法的枯燥。就是开地图–采集–生产,虽然夹杂了一些GAL要素的事件,以及为某些珍贵物品设置了在不同地点找A找B找C类的RPG要素,但总体玩下来还是过于流程化了。
Mujintou_Monogatari_022

当然更失望的是,这个黄油它不黄啊!其实玩之前是有预感的,因为貌似SFC的正式游戏是完全没有带颜色的东西的,但这家伙又确实名声在外不是?打通关以后终于搞清了其中的关系——有颜色的是初版的PC98版,而往后虽然复刻多次,却都很正经了。
所以游戏的对话里虽然还残留了一些“有故事”的痕迹,但立绘真的从始至终十分正经。
Mujintou_Monogatari_009
Mujintou_Monogatari_012
Mujintou_Monogatari_020

再一个不给力的地方是并非从无到有创造逃生装置。因为隐藏剧情是“被外星人当成人类大灾变后能否绝地求生的实验品”的缘故,剧情发生的岛上有各种各样文明人生活过的遗迹,什么坏发电机、坏电动机、坏潜艇、坏变压器、坏马达之类的东西都能找到,甚至还有一台坏掉的卫星通信求救系统。这就使得更多的关键道具是来自于刮地皮捡破烂而不是凭空手搓,成就感大大降低。一共6种通关方式,完全不靠修理破烂的通关方式好像只有最低级的小木船和热气球。
Mujintou_Monogatari_017

材料方面难度设置的脑洞倒值得鼓励。就像如果用亚麻给4个女生做了泳装,后面逃出的时候用来做大帆船的布就不够了;橡胶只有一点点,做了飞艇就不能修卫星。这点有些资源窘迫的味道,值得表扬。
Mujintou_Monogatari_035

费时费力打出的隐藏结局根本不像是对玩家的鼓励。普通的好结局还回归人类社会了呢,隐藏结局竟然被放回去后被清除记忆了。普通结局还有妹子陪着,隐藏结局就只剩一只猴子了,上哪说理!
Mujintou_Monogatari_042
Mujintou_Monogatari_044
Mujintou_Monogatari_048
Mujintou_Monogatari_050


  • (1):中西和天龙是当年流行的两种不同的游戏币,二者厚度和重量略有差异。
  • (2):2008年老任把这部复刻版在wii上又复刻了一遍,叫做25周年纪念版,良心复刻有了自己的没良心复刻。
  • (3):金牌玛丽为磁碟机设计,特别的难。在北美发售前被紧急叫停。找来一个叫“梦工厂”的游戏换皮成马里奥中的人物,作为美版SMB2发售。后来美国人把日版马里奥2叫做“失落的关卡”,日本人把美版马里奥2叫“马里奥USA”
《无人岛物语》采用署名-非商业性使用-禁止演绎许可协议进行许可。 『破袜子』期待与您交流。

闹心的vps

作者 大灰
2026年1月30日 23:52
昨天(29)晚上本来要更新来着,结果😴睡着了,草稿就放在那里,直到30号早上。起来看了一眼手机还在网站页面,刷新了一下直接522,给我整不会了,先上班再说。 vps也无法登陆,让人真是煎熬,我以为是小故障,直到10点依然没有恢复,CC官网也登陆不了,给客服发邮件他们才后知后觉知道,真是太不专业了。 开始以为是堆栈出问题,没想到看网上说是被勒索了,真是服了cloudcone。 只能做做最坏的打算,主站和图床做了备份,其他的站点就没这么乐观,只备份了数据库。能恢复最好,大不了就做这一个站点了…… 2026.01.31更新 我们写信是为了就影响您服务的事件提供明确的更新。 我们使用的平台(Virtu […]

近期使用QOSAddSocketToFlow()在Windows下建立QoS踩过的坑

作者 大致
2025年12月25日 15:18

客户要求给原有Socket 通信增加QoS 功能,包括了Server 端和Client 端。示例代码似乎平平无奇,实装却花了三周半。尤其是最后的那个问题,困扰了我半个月。今天终于解决了,简单记录一下,希望能帮到需要的人。

第①个问题

现象:CreateQosHandle() 失败,GetLastError() = ERROR_NOT_SUPPORTED(50)
原因:CreateQosHandle()只有两个参数,出现这个错误是因为有的例子太老了,给第一个参传了{1, 1}。实际上进入Win10 时代之后第一个参就只能传{1, 0}。
解决办法:CreateQosHandle()第一个参传{1, 0}。

第②个问题

现象:QoSAddSocketToFlow() 失败,GetLastError() = WSA_INVALID_PARAMETER(87)
原因:
1)某些例子太老,第5个参传了0。新版本函数只能传两个定义好的宏:QOS_NON_ADAPTIVE_FLOW 和QOS_QUERYFLOW_FRESH,不能传0。本例的使用场景实际只能传QOS_NON_ADAPTIVE_FLOW。
2)我的PC上有两块网卡,连接内网环境的是第二块网卡。因此第2个参不能传NULL,而要通过给一个SOCKADDR结构体赋值IP 地址和Port 的方式,指定使用的网卡。
解决办法:第2个参在握手成功后过CAsyncSocket 的 GetPeerName() 取得连接用的IP地址和端口号,第5个参固定传QOS_NON_ADAPTIVE_FLOW。

第③个问题

现象:同时启动Server 和Client,Client 调用QoSAddSocketToFlow() 失败,GetLastError() = ERROR_NOT_FOUND(1168)
原因:添加QoS 的Socket 不支持用自己的Client 连接自己的Server。
解决办法:再找一台开发器。
P.S: 这个就是我上次吐槽AI的事件。

第④个问题

现象:在确定Socket握手成功的回调函数中添加QoS,Client 调用QoSAddSocketToFlow() 失败,GetLastError() = ERROR_ACCESS_DENIED(5)
原因:添加了QoS 的Server 需要管理员权限运行。
解决办法:调试时Server 端用管理员执行Visual Studio,或者给工程属性–Linker–Manifest File–UAC level 改成【requireAdministrator(/level=’requireAdministrator’)】。

第⑤个问题

现象:Client 的OnConnect(int nErrorCode) 回调中,有时nErrorCode = WSAEWOULDBLOCK(10035)
原因:这不是问题。只是Socket握手过程发生了延时。
解决办法:点两滴眼药水。

第⑥个问题

现象:Socket 连接建立后,Server 端立刻收到OnClose() 回调,并且传入的参数 = WSAECONNABORTED(10053)。
原因:既存的工程在Client创建socket的时候,立刻调用了SetSockOpt()设置了SO_LINGER,并且设定的值是{1, 0},目地是Socket Close 时不等待缓存,直接进行硬关闭。但是这个属性如果在socket握手成功前被设定,那么在调用QoSAddSocketToFlow() 的同时就会产生这样的关闭。
解决办法:将SetSockOpt 的调用时机改到socket 连接建立之后,亦即,Client 端在OnConnect(0)后调用,Server 端在OnAccept(0) 后调用。

其它说明

10035本身不用管,但是跟10053长得太像了。
Server 端也不能用127.0.0.1,不知是否跟多网卡有关。
问题③、④和问题⑥干扰的选项太多,一度非常怀疑杀毒软件、防火墙、域策略,非常混乱。
问题①、②都是通过比较不同的例子找到的破绽。
问题③靠的是CSDN上的一句吐槽。
问题④最终解决靠的是在Git上广搜例子,在一个示例的说明里看到Server侧需要在管理员权限下运行的提示,方解决。
问题⑥最后是用了排除法编程,逐行注代码的笨办法筛出来的。全网没有人遇到同样的问题。可能就没有人提前设SO_LINGER 吧……

示例代码

共通类,继承CAsyncSocket:

#pragma once
#include <afxsock.h>
#include <qossp.h>
#include <winsock2.h>
#include <qos2.h>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "qwave.lib")

class CCommonQosSocket : public CAsyncSocket
{
public:
    CCommonQosSocket()
        : m_hQos(NULL)
        , m_dwFlowId(0)
        , m_ver({1, 0}){}
    virtual ~CCommonQosSocket() {
        CloseWithQos();
    }

    BOOL CreateQosHandle() {
        if (m_hQos) {
            QOSCloseHandle(m_hQos);
            m_hQos = NULL;
        }
        if (!QOSCreateHandle(&m_ver, &m_hQos)) {
            int nLastError = GetLastError();
            return FALSE;
        }
        return TRUE;
    }

    BOOL GetPeerAddr(SOCKADDR_IN& peerAddr) {
        int len = sizeof(peerAddr);
        if (!GetPeerName((SOCKADDR*)&peerAddr, &len)) {
            int n = GetLastError();
            return FALSE;
        }
        return TRUE;
    }

    BOOL AddQosFlow(QOS_TRAFFIC_TYPE trafficType, SOCKADDR* pAddr) {
        if (!m_hQos || !m_dwFlowId) {
            return FALSE;
        }

        SOCKADDR* pTgtAddr(pAddr);
        SOCKADDR_IN peerAddr{};
        if (!pTgtAddr) {
            if (!GetPeerAddr(peerAddr)) {
                return FALSE;
            }
            pTgtAddr = static_cast<SOCKADDR*>(&peerAddr);
        }

        BOOL bRet = QOSAddSocketToFlow(m_hQos,
                                  static_cast<SOCKET>(*this),
                                  pTgtAddr,
                                  trafficType,
                                  QOS_NON_ADAPTIVE_FLOW,
                                  &m_dwFlowId);
        int nLastError = GetLastError();
        return bRet;
    }

    void CloseWithQos() {
        if (m_dwFlowId && m_hQos) {
            QOSRemoveSocketFromFlow(m_hQos,
                                    static_cast<SOCKET>(*this),
                                    m_dwFlowId, 
                                    0);
        }

        if (m_hQos) {
            QOSCloseHandle(m_hQos);
            m_hQos = NULL;
        }
        m_dwFlowId = 0;
        __super::Close();
    }

private:
    HANDLE      m_hQos;
    DWORD       m_dwFlowId;
    QOS_VERSION m_ver;
};

Server端部分代码:

#include "CommonQosSocket.h"

class CClientSocket: public CCommonQoSSocket {
};

class CListenSockt : public CCommonQoSSocket {
public:
    virtual void OnAccept(int nErrorCode) override {
        CAsyncSocket::OnAccept(nErrorCode);
        CClientSocket* pNewClient = new CClientSocket;
        sockaddr addr;
        int iAddrLen = sizeof(addr);
        if (Accept(*pNewClient, &addr, &iAddrLen)) {
            pNewClient->CreateQosHandle();
            if (pNewClient->AddQosFlow(QOSTrafficTypeBestEffort, &addr))
                //sccess;
                linger closeLinger{1,0};
                (void)pNewClient->SetSockOpt(SO_LINGER, (const void*)&closeLinger, sizeof linger);
            else {
                //failed
            }
        }
    };
};

void CQoSServerDlg::OnBnClickedButtonStart()
{
    CClientSocket* pListen = new CClientSocket; 
    CString csLocalIP(L"192.168.8.4");
    int nListenPort(32000);

    if (!pListen->Create(nListenPort,
        SOCK_STREAM, FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE,
        csLocalIP)) {
        int nError = GetLastError();
        AfxMessageBox(L"Listen Failed.");
        return;
    }

    if (!m_ListenSock.Listen()) {
        AfxMessageBox(L"Listen Failed.");
        return;
    }
}

Client端部分代码:

#include "CommonQosSocket.h"

class CClientSocket: public CCommonQoSSocket {
public:
    virtual void OnConnect(int nErrorCode) overwride {
        CAsyncSocket::OnConnect(nErrorCode);
        if (nErrorCode) {
            return;
        }
        CreateQosHandle();
        if (this->AddQosFlow(QOSTrafficTypeBestEffort, nullptr)) {
            //success
            linger closeLinger{1,0};
            (void)this->SetSockOpt(SO_LINGER, (const void*)&closeLinger, sizeof linger);
        }
        else {
            //failed
        }
    }
};

void CQoSClientDlg::OnBnClickedButtonConnect()
{
    CClientSocket* pClient = new CClientSocket;
    pClient->CreateQosHandle();
    CString csLocal(L"192.168.8.11");
    CString csServer(L"192.168.8.4");
    int nPort(32000);
    pClient->Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE,
        csLocal);
    if (m_sock.Connect(csServer, nPort)) {
    }
    else {
    }
}

就酱紫,找到问题⑥的原因花了13天,改掉只需要5分钟。


  • (1):2008年老任把这部复刻版在wii上又复刻了一遍,叫做25周年纪念版,良心复刻有了自己的没良心复刻。
  • (2):金牌玛丽为磁碟机设计,特别的难。在北美发售前被紧急叫停。找来一个叫“梦工厂”的游戏换皮成马里奥中的人物,作为美版SMB2发售。后来美国人把日版马里奥2叫做“失落的关卡”,日本人把美版马里奥2叫“马里奥USA”
  • (3):就是LSD
❌