在 linux 和 windows 进行 cpp 的网络编程的常见 bug 和异同点总结
目录
字符串意外终止
现象:使用 TCP 的 recv 的时候,消息被意外截断
可能原因:如果加密消息中间带有’\0’字符串,则消息会被认为提前结束,这样解密的消息就错了.
解决方法:检查之后发现,其实我使用了 char*
结构来保存消息导致的,换成 unsigned char*
来接收就好了.
输入被意外截断
现象:比如聊天发送消息时,输入之后按回车,发送出了意外的消息
可能原因:输入缓冲区没清空,上一次的输入还残留着
解决方法:清空缓冲区,几种示例如下
cpp
1 | cin.sync(); // 清空输入缓冲区 |
接收到意外字符
现象:接受消息时收到了不是自己发送的意外字符
可能原因:消息体没有初始化,可能为随机字符
解决方法:提前初始化,比如如下
cpp
1 | char msg[256] = {0}; // 初始化为0 |
接收不到消息
现象: C/S 模式发送消息时,对方收不到消息
可能原因:可能消息被存在 TCP 的缓冲区没有拿出来
解决方法:发送和接受时都指定报文大小即可,也就是每次都收发相同大小的报文 (不过开销会变大,待优化)
PS: 当然也有可能是其他自己的原因,比如函数逻辑错误 (被自己蠢哭一次)
输出延迟显示
现象:输出总是在下一次显示
可能原因:输出缓冲区卡住
解决方法:手动刷新: fflush(stdout);
linux 和 windows 多线程的使用不同
现象:同一份函数,不同平台多线程报错
可能原因: linux 和 windows 对多线程的支持的库有点不一样
解决方法:举例如下
不是类的成员函数的话,使用 thread
和 pthread
都可以,如下
cpp
1 | pthread_t tid_recv, tid_send; |
是类的函数,多线程得用 thread
库,如下
cpp
1 |
|
linux 的 clock 返回值同
现象:同一份函数在不同平台结果不一样,clock 计数不一样
可能原因: posix 中 clock 的单位是 10^6, 而 windows 是 10^3
解决方法:多除 3 位…
本博客采用 CC BY-NC-SA 4.0 许可。转载请声明来自 Juice's Blog!