我正在使用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';
as
read()
不附加空终止符,而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/