0

我正在使用 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);
            }

          }

我如何发送消息: void client_write_message ( char * msg, int client_sender, int client_receiver) { char * 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);
    }
4

1 回答 1

2

这是不正确的:

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

asread()不附加空终止符,这strlen()取决于。返回的值strlen()是未知的,可能会导致访问越界buf。删除空终止符分配并替换为:

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

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

于 2013-06-21T08:09:52.047 回答