C++ FIFO服务器读取用户名异常问题求助
问题分析与修复方案
你的服务器代码存在几个关键错误,导致无法正确读取用户名:
1. 文件描述符非法转换
在第二个read调用中,你错误地将文件描述符fd强制转换为char类型:
read((char)fd, &username, sizeof(char)* length)
这会把原本的整数文件描述符变成一个字符值,完全不是合法的文件句柄,导致读取失败。应该直接使用fd,不需要任何转换。
2. 未初始化的指针与内存分配缺失
username是一个未初始化的char*指针,没有为其分配足够的内存来存储用户名。直接对&username进行read操作会写入非法内存地址,引发未定义行为。你需要在读取长度后,为username分配大小为length + 1的内存(额外空间用于存储终止符\0)。
3. 终止符处理错误
你使用strlen(username)来添加终止符,但此时username指向的内存可能没有有效的字符串终止符,strlen会越界读取内存,导致不可预测的结果。既然已经知道用户名的长度length,直接在username[length]位置设置\0即可。
修复后的代码
修改后的copyUsername函数
void copyUsername(int fd, char *&username, int &length) { printf("Waiting for client login...\n"); if (read(fd, &length, sizeof(int)) == -1) { printf("Could not read in the fifo 1\n"); return; } printf("Client wrote an username\n"); printf("%d\n", length); // 分配内存,额外留一个位置存终止符 username = (char*)malloc(sizeof(char) * (length + 1)); if (!username) { printf("Failed to allocate memory for username\n"); return; } // 正确使用fd,读取到username指向的内存 if (read(fd, username, sizeof(char)* length) == -1) { printf("Could not read in the fifo 2\n"); free(username); // 分配失败要释放内存 username = nullptr; return; } // 直接用已知长度设置终止符 username[length] = '\0'; printf("%s\n", username); printf("Copied successfully from FIFO %s\n", username); }
额外注意事项
- 在后续使用完
username后,记得调用free(username)释放内存,避免内存泄漏。 - 确保客户端发送的
length值是正确的用户名长度(不包含终止符),否则会导致内存浪费或字符串截断。
内容的提问来源于stack exchange,提问作者fabi
相关产品推荐
相关产品推荐

