0

实现 TCP 服务器/客户端聊天,我想验证新客户端的用户名是否不存在。服务器的代码部分是:

do
{
    err=0;
    if(write(socketFd[(int)idx], nickMsg, strlen(nickMsg))<0)
        perror("write");
    memset(buff, 0, sizeof(buff));
    read(socketFd[(int)idx], buff, sizeof(buff));
    for(i=0; i<supportedUsrsNum; i++)
    {
        if(*names[i]!=0)
        {
            if(strncmp(buff, names[i], strlen(buff))==0)
            {
                err=-1;
                write(socketFd[(int)idx], usrExstMsg, strlen(usrExstMsg));
                break;
            }
        }
    }
    if(!err)
        break;
}
while(err==-1);

客户写道:

do
{
    gets(sendBuff);
    write(sockFd, &sendBuff, sizeof(sendBuff));
    sleep(1);
}while(1);

当第二个客户端尝试现有名称时,服务器检测到它并进行第二次迭代,其中它的 read() 获得 ASCII 值 3,尽管客户端没有进一步的输入。我错过了什么,如何从客户那里重新读取新值?

4

1 回答 1

3

可能read()实际上不是在读取 ASCII 3,而是读取零字节。可能发生了错误情况。始终检查调用的返回值,read()因为

  1. 它可能会返回失败条件,或者
  2. 它可能读取的字节数少于请求的字节数。

还:客户端正在发送整个 'sendBuff' 与此行:

write(sockFd, &sendBuff, sizeof(sendBuff));

您可能只想发送字符串本身(带有一些终止字符,如'\0'或'\n')。Usingsizeof(sendBuff)将发送在 输入的实际文本gets()、'\0' 终止符,然后是在sendBuff调用之前已经存在的任何随机字节gets()

将该行更改为类似

write(sockFd, &sendBuff, strlen(sendBuff) + 1);

只写文本和'\ 0',而不是任何额外的垃圾。

另外,不要使用gets(). 这是邪恶的。(感谢 Jonathan Leffler 对此的提醒。)

于 2013-06-18T18:09:55.027 回答