分类 未分类 下的文章
lwip和socket编程入门
http://www.nongnu.org/lwip/2_1_x/index.html
https://beej.us/guide/bgnet/html/
问题: 如果tcp连接过程中网断了(网线拔出/路由器断电)怎么办?
回答: 参考https://stackoverflow.com/questions/14782143/linux-socket-how-to-detect-disconnected-network-in-a-client-program
总的来说, socket中的send
和recv
都不会关心网是不是断了. 正如前述参考回答中所说, tcp send只有在tcp连接没有正确建立或者缓冲溢出的时候才会明确报错, 否则它只会不断重试, 在linux上重试时间可能长达5分钟. 同样,recv
如果不设置超时, 就会一直等待, 它也不知道网断了.
古代坐姿
ESP32C3有flash加密功能
nc(netcat)入门
参考:
https://blog.csdn.net/qq_35787138/article/details/113923316
https://www.runoob.com/linux/linux-comm-nc.html
windows上的nc使用的是cygwin里带的
注意:windows上的nc.exe命令写端口号前面需要-p
,如nc -l 9999
在windows平台可写作nc -l -p 9999
TCP Server
nc -l 9999
TCP Client
nc localhost 999
nc www.baidu.com 80
输入命令回车即发送. HTTP是基于TCP的, 所以可以连接HTTP服务器, 再发送GET命令即可
UDP Server
nc -u -l 999
UDP Client
nc -u localhost 999
特别注意: 在Win10上通过cmd和bash使用nc, 都是tcp模式localhost连接可用, 而udp server/client localhost连接不可用. 一定要用wsl2的模式才行(ubuntu 18.04). 在不同主机上连接倒都没有问题
UDP Broadcast
nc -b -u 192.168.1.255 9999
注意, windows版本的nc里面都没有-b选项.
frp建立ftp穿透
由于ftp不止使用了1个端口,包括连接时候使用的控制端口和数据传输时候使用的数据端口. 并且ftp协议本身会发送ip地址和数据端口号(而不是用frp服务器的端口号),所以frp配置有些与众不同.
要点:
- ftp服务器使用Passive被动模式, 并且配置被动模式端口范围
- frp端口映射中, ftp控制端口数字可以和frp服务器映射端口不一致(如一个使用2121, 另一个使用3131), 但ftp数据端口必须和frp服务器映射端口数字一致(如使用3333就必须都是用3333).
- 非必须: ftp服务器配置net转换地址. 这个似乎在filezilla客户端上不是必须的, filezilla会自动对NAT前的地址替换为服务器地址.
ftp服务器配置命令, 以pyftplib为例(如果需要服务器可写,再加上选项-w
):
python -m pyftpdlib -r 3333-3334
frpc.ini配置:
[ftp_data1]
type =tcp
local_ip = 127.0.0.1
local_port = 3333
remote_port = 3333
[ftp_data2]
type =tcp
local_ip = 127.0.0.1
local_port = 3334
remote_port = 3334
[ftp_control]
type =tcp
local_ip = 127.0.0.1
local_port = 2121
remote_port = 3131
真是猫主子划拉包装袋
会开疯(封)了!
Typecho无插件统计文章阅读量/站点访问量(转)
一组人群中出现重复生日的概率是多少?
忽然想起这个命题, 在若干年以前, 军训的时候教官说我们班上40多人里必然有两个人同一天过生日, 还说没看过我们的生日, 感觉跟魔术一样. 让大家验证了一下, 居然有两组人的生日都在同一天. 而在之前公司里面20多个人, 也有同一天过生日的. 那么究竟一组人群里重复生日的概率是多少呢? 想验证一下.
用node.js来验证, 验证10万组:
const testTimes = 100000
const yearLength = 365
function main(){
var doubledBirthdaysArrayLengths = []
for(let i = 0; i < testTimes; i++){
doubledBirthdaysArrayLengths.push(doubledLength())
}
console.log("一组人群中有相同生日的概率是多少?")
console.log("有重复生日的人群的人数: ")
console.log(doubledBirthdaysArrayLengths)
console.log('生日重复的一组中最多人数: ', Math.max(...doubledBirthdaysArrayLengths))
console.log('生日重复的一组中最少人数: ', Math.min(...doubledBirthdaysArrayLengths))
console.log('生日重复的一组中平均人数: ', average(doubledBirthdaysArrayLengths))
distribute(doubledBirthdaysArrayLengths)
}
function distribute(arr){
let peopleNumsofGroups = [] //一组中的人数为数组下标, 数组值为此组人数出现的次数.
for(let i = 0; i < yearLength; i+=1){
peopleNumsofGroups.push(0)
}
for(let a of arr){
peopleNumsofGroups[a]++
}
// console.log('Distribute: ', days)
console.log('重复生日人群, 某一人数出现的次数:')
printArrayInTable(peopleNumsofGroups, 0)
let probes = [], sum = average(peopleNumsofGroups) * peopleNumsofGroups.length
for(let i = 0; i < yearLength; i+=1){
if(i == 0){
probes[i] = peopleNumsofGroups[i]/sum * 100
}else{
probes[i] = peopleNumsofGroups[i]/sum * 100 + probes[i - 1]
}
}
console.log('概率:')
printArrayInTable(probes, 2)
}
function printArrayInTable(arr, fixDigits){
console.log('\t[0]\t[1]\t[2]\t[3]\t[4]\t[5]\t[6]\t[7]\t[8]\t[9]')
for(let row = 0; row < yearLength / 10 + 1; row+=1){
let out = '[' + row + ']\t'
for(let col = 0; col < 10; col+=1){
let index = row*10 + col
if(index >= yearLength){
return
}
out += arr[row*10 + col].toFixed(fixDigits) + '\t'
}
console.log(out)
}
}
function average(arr){
let sum = 0
for(let a of arr){
sum += a
}
return sum / arr.length
}
function doubledLength(){
let birthdays = []
for(let i = 0; i < yearLength + 1; i+=1){
var birthday = parseInt(Math.random()*yearLength)
if(findDouble(birthday, birthdays)){
birthdays.push(birthday)
// console.log("birthdays: ", birthdays)
return birthdays.length
}
birthdays.push(birthday)
}
return birthdays.length
}
function findDouble(obj, arr){
for(let a of arr){
if(a == obj){
return true
}
}
return false
}
main()
输出结果如下:
一组人群中有相同生日的概率是多少?
有重复生日的人群的人数:
[
19, 22, 14, 3, 13, 25, 10, 24, 56, 5, 15, 27,
25, 18, 27, 19, 22, 38, 21, 41, 9, 13, 37, 36,
28, 25, 22, 29, 11, 23, 19, 14, 13, 16, 32, 26,
8, 19, 7, 36, 6, 22, 18, 23, 20, 33, 32, 21,
64, 22, 48, 43, 5, 16, 14, 7, 19, 32, 15, 16,
15, 33, 58, 19, 26, 18, 45, 31, 4, 5, 30, 26,
14, 19, 31, 14, 6, 9, 27, 12, 47, 51, 7, 21,
16, 42, 66, 15, 28, 32, 18, 10, 12, 14, 10, 16,
23, 15, 23, 8,
... 99900 more items
]
生日重复的一组中最多人数: 84
生日重复的一组中最少人数: 2
生日重复的一组中平均人数: 24.60991
重复生日人群, 某一人数出现的次数:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
[0] 0 0 279 577 842 1006 1334 1520 1873 1949
[1] 2223 2441 2627 2684 2975 2878 3110 3148 3229 3227
[2] 3269 3199 3180 3195 2974 3076 3014 2846 2747 2650
[3] 2624 2440 2327 2111 2096 1863 1807 1647 1564 1399
[4] 1271 1162 1023 996 884 773 738 642 575 541
[5] 460 394 384 325 277 247 203 173 143 148
[6] 111 97 79 71 55 53 41 36 31 18
[7] 24 16 9 16 4 5 7 2 6 6
[8] 1 0 1 0 2 0 0 0 0 0
[9] 0 0 0 0 0 0 0 0 0 0
[10] 0 0 0 0 0 0 0 0 0 0
[11] 0 0 0 0 0 0 0 0 0 0
[12] 0 0 0 0 0 0 0 0 0 0
[13] 0 0 0 0 0 0 0 0 0 0
[14] 0 0 0 0 0 0 0 0 0 0
[15] 0 0 0 0 0 0 0 0 0 0
[16] 0 0 0 0 0 0 0 0 0 0
[17] 0 0 0 0 0 0 0 0 0 0
[18] 0 0 0 0 0 0 0 0 0 0
[19] 0 0 0 0 0 0 0 0 0 0
[20] 0 0 0 0 0 0 0 0 0 0
[21] 0 0 0 0 0 0 0 0 0 0
[22] 0 0 0 0 0 0 0 0 0 0
[23] 0 0 0 0 0 0 0 0 0 0
[24] 0 0 0 0 0 0 0 0 0 0
[25] 0 0 0 0 0 0 0 0 0 0
[26] 0 0 0 0 0 0 0 0 0 0
[27] 0 0 0 0 0 0 0 0 0 0
[28] 0 0 0 0 0 0 0 0 0 0
[29] 0 0 0 0 0 0 0 0 0 0
[30] 0 0 0 0 0 0 0 0 0 0
[31] 0 0 0 0 0 0 0 0 0 0
[32] 0 0 0 0 0 0 0 0 0 0
[33] 0 0 0 0 0 0 0 0 0 0
[34] 0 0 0 0 0 0 0 0 0 0
[35] 0 0 0 0 0 0 0 0 0 0
概率:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
[0] 0.00 0.00 0.28 0.86 1.70 2.70 4.04 5.56 7.43 9.38
[1] 11.60 14.04 16.67 19.36 22.33 25.21 28.32 31.47 34.70 37.92
[2] 41.19 44.39 47.57 50.77 53.74 56.81 59.83 62.67 65.42 68.07
[3] 70.70 73.14 75.46 77.57 79.67 81.53 83.34 84.99 86.55 87.95
[4] 89.22 90.38 91.41 92.40 93.29 94.06 94.80 95.44 96.01 96.56
[5] 97.02 97.41 97.79 98.12 98.40 98.64 98.85 99.02 99.16 99.31
[6] 99.42 99.52 99.60 99.67 99.72 99.78 99.82 99.85 99.88 99.90
[7] 99.93 99.94 99.95 99.97 99.97 99.98 99.98 99.98 99.99 100.00
[8] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[9] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[10] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[11] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[12] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[13] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[14] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[15] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[16] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[17] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[18] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[19] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[20] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[21] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[22] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[23] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[24] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[25] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[26] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[27] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[28] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[29] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[30] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[31] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[32] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[33] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[34] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
[35] 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00 100.00
可以看到, 班上有40个人的时候, 有重复生日的概率已经高达90%左右了. 按中国班级的规定, 小学标准是45人,有94%的概率有两人同一天过生日. 初高中是50人, 概率则高达97%.如果把两个班放在一起, 概率就是100%了.
KEIL/LX51: WARNING L48: IGNORED RECURSIVE CALL 解决办法
译文: https://blog.csdn.net/u010160335/article/details/113679731
原文: https://developer.arm.com/documentation/ka002275/latest
总之是LX51.exe
的版本问题. 文中说是v.4.66.97.0有此问题, 我在v.4.66.66.0上也有遇到, 在原文链接里面有升级包下载, 覆盖原来的LX51.exe就好了.
物联网各种协议
名称 | 说明 | 频段 | 组网 |
---|---|---|---|
LoRaWAN | 低功耗广域网, 公里级范围内组建的独立网络 | 470M/868M/913M等 | |
NBIoT | 5G标准之一, 附带在运营商基站上实现的低功耗物联网 | 800M/900M/1800M | |
IEEE 802.15.4 | 相当于IPV6无线物联网的物理层PHY和数据链路层MAC | ||
Zigbee | 基于IEEE 802.15.4的低功耗物联协议, 可软件升级至6LoWPAN,似乎会被后者取代 | 868M/915M/2.4G | 星型,mesh |
6LoWPAN | IPV6标准之一, 基于IEEE 802.15.4, 是IP层和MAC层之间的适配层 | 868M/915M/2.4G | Mesh |
Thread | 基于6LowPAN的互联协议 | Mesh | |
蓝牙 | 有基础蓝牙和BLE蓝牙两种,距离比较短 | 2.4G | 星型, Mesh |
NFC | 可通过无源的NFC标签提供信息 | 13.56M | 1对1 |
WIFI | 这个我们都熟悉, 用于物联网的一般都是2.4G | 2.4G, 5.8G | 星型 |
HomeKit | 苹果的物联网接入协议, 将配件接入iOS终端 | ||
HarmonyOS Connect | 华为的物联网接入协议 |
doit sdk分析
语言结构分析工具
据说LLVM可以用来分析结构,这儿有一个例子, 不过这儿还是推荐Sourcetrail。知乎上有一篇介绍.
其他工具还有cdsan
bat入门
之前的文章
windows批处理bat根据查找字符串结果做不同处理
bat设置当前目录为path路径的方式
windows批处理batch调用新进程/窗口,不阻塞当前进程的继续执行
windows batch语法参考资料
简单描述
- %1 %2 %3 ...代表
.bat
的第1/2/3...个输入参数 - 条件判断括号中的变量是先替换为值再执行的, 如
set var1=xxx set var2=ABC if %var1% == xxx ( set var2=DEF echo %var2% )
将输出ABC而不是DEF
uni-app入门
资源
使用阿里云小程序开发工具
- 新建->mPaaS->Uni APP, 编译会失败, 查看日志, 会提示没有
cross-env
, 需要选择左侧的npm依赖管理
图标, 在开发依赖
中增加cross-env