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

标签 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 ( 字符*消息, 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/

相关文章:

c# - BackgroundWorker 的 OnDoWork 是从调用线程还是工作线程调用的?

java - 在 Java 中通过 Socket 处理 POST 请求

c++ - 我的程序不发送消息或不接收到套接字,ip 是 127.0.0.1

linux - TPROXY - 获取准确的目标/远程 IP 地址

c# - 为什么整数属性有时会返回 0?

python线程,如何返回多线程代码执行过程中产生的结果

c - 新数组和指针

比较 C 中的两个 GUID

c - 将数组传递给已扫描的函数

c - 什么时候可以完全优化 volatile 变量?