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