我正在使用C语言中的sockets和thread开发一个聊天服务器,但是我有不同的问题:
-我不能用他的昵称给客户发信息
-我在发送邮件和附加客户端发件人昵称时遇到问题
你能帮我一下吗?
如何修改昵称:

          /* 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);
            }

          }

如何发送消息:
无效
客户端写入消息(
字符*消息,
int客户端发送方,
内部客户机接收器)
{
字符*缓冲区;
缓冲区=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';

asread()不附加空终止符,而strlen()依赖于空终止符。strlen()返回的值未知,可能导致对buf的访问超出界限。删除空终止符分配并替换为:
if (rc > 0)
{
    snprintf(clients_nick[client], MAX_NICK_LENGTH - 1, "%.*s", rc, buf);
}

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

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

10-12 02:57