目录


字符串意外终止

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

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

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

输入被意外截断

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

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

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

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);

接收到意外字符

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

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

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

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都可以, 如下

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库, 如下

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位…