gpt4 book ai didi

C - 带线程的套接字聊天服务器 - 昵称数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:42 25 4
gpt4 key购买 nike

我正在使用 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 ( 字符*消息, int client_sender, int client_receiver) { 字符 * 缓冲区; 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);
}

最佳答案

这是不正确的:

buf[strlen(buf) - 1] = '\0';

作为read()不附加空终止符,strlen() 依赖于此。 strlen() 返回的值是未知的,可能会导致对 buf 的访问越界。删除空终止符分配并替换为:

if (rc > 0)
{
snprintf(clients_nick[client], MAX_NICK_LENGTH - 1, "%.*s", rc, buf);
}

read()的结果是读取的字符数,存储在贴出的代码中的rc中,格式说明符%.*s 使用长度和缓冲区,并且不需要缓冲区以 null 终止。

关于C - 带线程的套接字聊天服务器 - 昵称数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17229990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com