记录学习日常


/** *******************gdb 简单调试**** /
gdb  ./interver
r
bt  查看
q  // 退出
b   func  // 打断点
b x.c:180   // 某行打断点 。。
p 变量 //  打印变量内容  
c  // 继续运行 到达下一个断点
n  // 逐行调试
t 跳线程。  
info b  查看断点
delete b 删除断点
/************valgrind  内存检测************************/
前置  chmod 777 intersvr  权限 
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --log-file=valgrind.log ./intersvr


/************linux  操作***********/
netstat -antp | grep 29999  // 查看端口占用
kill -9  进程号  // 消灭进程 
 tcpdump -i any host 10.20.31.31 -vnn -A    抓包并显示。
export LD_LIBRARY_PATH=./  //  设置共享库路径 
pidof    命令用于检索指定的命令,返回相应的进程ID
top 
g++  nn.cpp -I ./inlude/ -L ./sdk/ -lpthread -lnvssdk -o nn  // g++编译
find  "/" -name "*.cpp"  
gcc ngx.c -o ngx  // gcc 编译

mount -t cifs -o username=*****,password=***** //ip /mycode lly  // 挂载
unmount lly // 卸载
df -h  // 查看挂载。
umount -l   / (立即断开挂载) umount 目标忙时用  
firewall-cmd --zone=public --add-port=9001/tcp --permanent // 添加端口号
firewall-cmd --reload // 重启防火墙

tcpdump -i ens33 host ip-s 0 -w /root/lly.cap  // 抓包
tcpdump -i ens33 host ip -s 0 -w /opt/lly.cap

ifconfig 网络
 chmod 777 * -R  // 修改文件权限 
strace  【命令】 查看命令运行

usr/bin/ld cannot find  * 解决   find / -name "libaes.so" //找到lib 库文件  然后 复制到生成库的位置。 


/****************常用 c 函数 **************************
memset  初始化数据
strcpy  复制数据  改用strncpy  第三个参数是目标容器的size
strcat  追加数据
strcmp  比较字符串相等  0  相等
strstr  是否包含某个字符串  true 第一个包含的地址  false : -- null
memcpy  内存拷贝 。
fprintf  函数 格式化输出数据 可用于拼接替换字符串。改用 fnprintf 

/**************window ********************************

#pragma comment(lib,"PlaySdkM4.lib")
win10  开启共享要开启SMB 服务。

HINSTANCE  hin;  //动态加载dll库函数
hin = LoadLibrary(L"delltestdll.dll"); DLL 文件使用
addp add = (addp)GetProcAddress(hin,"add"); / addp 是定义的函数指针

/***************linux 开发注意点****************************/ 

linux 下CALLBACK 需要定义为空 如 #define CALLBACK 因为CALLBACK 对应的是 _stdcal  这是一个回调规范 而在linux 没有对应的替换
 
#ifdef SDK9000_EXPORTS
#define ExportSDK9000_API __declspec(dllexport)
#else
#define ExportSDK9000_API __declspec(dllimport)
#endif
此段代码意思为 导入导出函数标记 在window 下开发使用 
这个是为了 找得到  向外界提供static 变量时避免找不到。可以不用。

搭建镜像环境
/opt/router_manager/  libs_config.json  添加 。so文件
json配置文件编码格式不要改成UTF-8 BOM格式,libjson.so解析不了,ANSI和UTF-8格式都行

/********************source insight*****************/ 
f8  高亮
ctrl + g 跳转指定行
F7  浏览定义
f9 代码块整体左移  f10 右移

/******************* 协议开发 问题反思*****************/ 
网络协议是一组双方约定好的特定的的传输字符片段和机制。


环境变量  动态包 依赖
建立连接 绑定ip 端口是否开放。
tcp连接数据 线程开启必要性,连接过程实现(模拟三次握手)  心跳机制 。  异步/同步数据发送 的不同处理方式

线程共用 。  通常是通过共同处理同一个数据容器来实现 ,如 循环同一个链表数据做处理 
设备断开重连机制  
绑定读取回调  (巧用回调)
绑定写入回调(在大量数据传输中  将数据缓存,等待连接空闲发送数据)
提取公共函数 降低耦合 (不要省事)
数据越界 。。 包粘连   数据发送不全  strcpy 慎用。
常用调试方法 :  gdb(主要)  tcpdump  log  

c 语言 --内存管理- 非正常流程结束  释放资源要慎重。通常情况下只处理本函数开辟的空间  不要乱释放 也不要不释放。

返回指针地址 作为句柄 时  返回内存地址   可能存在地址 快速开辟和关闭导致地址相同的情况 

结合上层业务,判断协议sdk 开发的什么程度
工具函数 要和业务逻辑解耦
发送信息 考虑 :解析session  之类的 需要 考虑 。是否需要  不要让发送信息逻辑 夹杂太多其他的逻辑 
              同步 要等待数据 
             异步 不等待接受数据 时 考虑如何回收消息,并处理
接受数据 :  接收数据的量 不代表读取数据的量   需要循环读取 直至 全部读取完数据。

原有功能开发 要保证原有函数参数的意义一致,
消息滞后 逻辑可通过线程完成异步。
代码逻辑可以自上而下编写 也要考虑自下而上的写法  例如 通过 type 得到最终发送数据 也可以通过最终数据向上推到type  然后 拼装数据发送

/******************* 编程规范 *****************/ 

 type
func_name 
{
  ...
}

数据释放  SAFE_FREE
json_object  统一用iserro 判断 
new json _object  用 log_fatal 打印日志。

/**************线程相关*****************************/
c 语言中 主线程传递给子线程 参数 时 地址相同 
c++  传递时不同 需要用ref , c++ 传递引用也是副本 不是同一个值 会执行拷贝函数(2次)。传递值会拷贝3次
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值