io多路复用,服务器不接收数据

时间:2015-04-14 00:07:30

标签: c unix client-server multiplexing

我正在写一个多路复用的客户端/服务器和我的服务器,在从客户端收到LOGIN命令后,等待帐户数据,但收到一个空结构,我不知道为什么。这是我的代码: Server:

autentica function:

client login function:

我尝试使用函数sleep(),但它没有用。 有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我还没有看到所有的代码,因为这里是晚上! :)

但我看到函数autentica(autentica.c)的代码似乎以错误的方式使用strcmp!我认为这可能是一个问题!

是:

 while (!feof(file)) {//legge finchè non finisce il file
        fread(&acc_to_cmp, sizeof(acc_to_cmp), 1, file);//recupera un account dal file
        if (strcmp(account.matricola, acc_to_cmp.matricola)) {//se l'utente esiste
            if (strcmp(account.password, acc_to_cmp.password)) {//controlla la password
                write(fd, (comm_t *)OK, sizeof(comm_t));//se coincidono concedi l'accesso
                fclose(file);
                return 1;
            }
            else{//se non coincidono
                write(fd, (comm_t *)WRONG_PASS, sizeof(comm_t));//nega l'accesso
                fclose(file);
                return 0;
            }
        }
    }//se l'utente non esiste

我认为应该是:

 while (!feof(file)) {//legge finchè non finisce il file
        fread(&acc_to_cmp, sizeof(acc_to_cmp), 1, file);//recupera un account dal file
        if (!strcmp(account.matricola, acc_to_cmp.matricola)) {//se l'utente esiste
            if (!strcmp(account.password, acc_to_cmp.password)) {//controlla la password
                write(fd, (comm_t *)OK, sizeof(comm_t));//se coincidono concedi l'accesso
                fclose(file);
                return 1;
            }
            else{//se non coincidono
                write(fd, (comm_t *)WRONG_PASS, sizeof(comm_t));//nega l'accesso
                fclose(file);
                return 0;
            }
        }
    }//se l'utente non esiste

当两个字符串相等时,strcmp函数返回0! :)

答案 1 :(得分:0)

可能在

    if( (fd = accept(......)) <0)

我觉得这个任务变得麻烦也会引起问题,有时候你不知道如何在应用程序中运行。你可以在判断之前做出分析。当然,这是我对此的看法。因为我有同样的问题。 我希望这对你有所帮助。或者帮助你找到解决问题的方法。告诉我,谢谢!

答案 2 :(得分:0)

解决!问题是我在第一个write()中传递了一个常量:write(socket, (comm_t *)LOGIN, sizeof(comm_t)); 虽然我必须首先在变量中保存“LOGIN”然后以这种方式传递它:write(socket, &command, sizeof(comm_t));