2013-06-21 28 views
0

我正在使用C中的套接字和线程聊天服务器,但我有不同的问题: - 我无法使用他的昵称发送消息给客户端 - 发送邮件时出现问题,并附上客户端发件人昵称 您能帮我解决这个问题吗?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( 字符* MSG, 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); 
    } 
+0

不要发布数百行代码,并询问关于它的一般问题,我们必须在代码中进行搜索。不要发布显示问题的最短代码,并提出具体问题,并尽可能在代码中指出。 –

+0

'client','client_sender'和'client_receiver'之间有什么区别?为什么不只是将所需的'clients_nick'数组成员预先添加到发送给客户端的任何内容中? – Will

回答

2

这是不正确的:

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使用长度和缓冲液和不要求缓冲区被终止。

+0

好的,但我不想在最后使用'\ n'。它也适用于它? – user2269756

+0

@ user2269756,如果换行符存在,则使用“rc - 1”。 – hmjd