目录


字符串意外终止

现象:使用 TCP 的 recv 的时候,消息被意外截断

可能原因:如果加密消息中间带有’\0’字符串,则消息会被认为提前结束,这样解密的消息就错了.

解决方法:检查之后发现,其实我使用了 char* 结构来保存消息导致的,换成 unsigned char* 来接收就好了.

输入被意外截断

现象:比如聊天发送消息时,输入之后按回车,发送出了意外的消息

可能原因:输入缓冲区没清空,上一次的输入还残留着

解决方法:清空缓冲区,几种示例如下

cpp
1
2
3
4
5
6
7
8
9
10
cin.sync(); // 清空输入缓冲区
cin >> select;

cin.ignore(); //忽略一个字符

if(cin.peek()=='\n') // 如果是回车则忽略
cin.ignore()

cin.ignore(256, '\n'); // 忽略一堆字符,直到遇到\n为止
cin.getline(msg, 256);

接收到意外字符

现象:接受消息时收到了不是自己发送的意外字符

可能原因:消息体没有初始化,可能为随机字符

解决方法:提前初始化,比如如下

cpp
1
2
3
char msg[256] = {0}; // 初始化为0

memset(&msg_send, 0, sizeof(msg_send)); // 如果是结构体之类的, 用memset

接收不到消息

现象: C/S 模式发送消息时,对方收不到消息

可能原因:可能消息被存在 TCP 的缓冲区没有拿出来

解决方法:发送和接受时都指定报文大小即可,也就是每次都收发相同大小的报文 (不过开销会变大,待优化)

PS: 当然也有可能是其他自己的原因,比如函数逻辑错误 (被自己蠢哭一次)

输出延迟显示

现象:输出总是在下一次显示

可能原因:输出缓冲区卡住

解决方法:手动刷新: fflush(stdout);

linux 和 windows 多线程的使用不同

现象:同一份函数,不同平台多线程报错

可能原因: linux 和 windows 对多线程的支持的库有点不一样

解决方法:举例如下

不是类的成员函数的话,使用 threadpthread 都可以,如下

cpp
1
2
3
4
5
pthread_t tid_recv, tid_send;
pthread_create(&tid_recv, NULL, recv_thread, NULL);
pthread_create(&tid_send, NULL, send_thread, NULL);
pthread_join(tid_recv, NULL);
pthread_join(tid_send, NULL);

是类的函数,多线程得用 thread 库,如下

cpp
1
2
3
4
5
6
7
8
9
10
11
#include "MyClass.h"
#include <thread>

MyClass::MyClass() {
std::thread t(&MyClass::threadFunc, this);
t.detach();
}

void MyClass::threadFunc() {
// 线程代码
}

linux 的 clock 返回值同

现象:同一份函数在不同平台结果不一样,clock 计数不一样

可能原因: posix 中 clock 的单位是 10^6, 而 windows 是 10^3

解决方法:多除 3 位…