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

时间:2013-06-21 07:35:43

标签: c multithreading sockets

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

1 个答案:

答案 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使用长度和缓冲区,不需要缓冲区无效终止。