/** *******************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次