我在C中使用套接字和线程做一个聊天服务器,但我有不同的问题: - 我无法使用他的昵称向客户发送消息 - 我在发送邮件时遇到问题并附上客户端发件人的昵称 你可以帮帮我吗?
我如何修改昵称:
/* Asks for client nickname */
if (strcmp(clients_nick[client], "") == 0) {
write(fd, msg, strlen(msg) * sizeof(char));
int rc = read(fd, buf, BUFLEN);
if (rc > 0) {
/* Deleting the character \n */
buf[strlen(buf) - 1] = '\0';
snprintf(clients_nick[client], MAX_NICK_LENGTH - 1, "%s", buf);
}
}
我如何发送消息: 空虚 client_write_message( char * msg, int client_sender, int client_receiver) { char * buffer; buffer = calloc(BUFLEN,sizeof(char));
snprintf(buffer, BUFLEN, "[%s", clients_nick[client_sender]);
buffer[strlen(clients_nick[client_sender])] = ']';
snprintf(buffer, BUFLEN, " %s", msg);
write(clients[client_receiver], msg, strlen(msg) * sizeof(char));
buffer[0] = '\0';
free(buffer);
}
答案 0 :(得分:2)
这是不正确的:
buf[strlen(buf) - 1] = '\0';
因为read()
没有附加strlen()
依赖的空终止符。 strlen()
返回的值未知,可能会导致访问buf
之外的界限。删除null终止符赋值并替换为:
if (rc > 0)
{
snprintf(clients_nick[client], MAX_NICK_LENGTH - 1, "%.*s", rc, buf);
}
read()
的结果是在已发布的代码中读取,存储在rc
中的字符数,格式说明符%.*s
使用长度和缓冲区,不需要缓冲区无效终止。