首页 文章

read()或write()函数不起作用

提问于
浏览
1

我试图从socket fds发送数据/读取数据

write()和read()函数 .

问题是其中一个工作不正常,我解释说:

write()将数据发送到“sockfd” - >“sockfd”使用read()函数将数据插入“answer”变量

问题是,当我尝试获取答案的内容时(使用通常的printf(“%s \ n”,答案)),它是空的 .

我不知道问题是来自read()还是write(),如果它们都失败了,它们返回-1所以我添加了一个简单的检查,看看其中一个是否返回<0 .

代码下方:

这个是发送者,问题来自最后一次write()调用[This:if(write(client_sockfd,denied,sizeof(denied))<0)]

if(login_required(client_ipaddr) == 1)
                                {
                                  char getpasswd[256];
                                  char auth[256]="auth-required";
                                  char granted[9]="granted";
                                  char denied[7]="denied";
                                  //checks that password file exists!
                                  //check_passwd_file("passfile",client_sockfd);
                                  log_string("[CLIENT-AUTH]Authentication required! ...");
                                  write(client_sockfd,auth,sizeof(auth));
                                  read(client_sockfd,getpasswd,sizeof(getpasswd));
                                  //log_string(getpasswd);
                                  //check here
                                  if(strcmp(getpasswd,"jasmtest") == 0)
                                  {
                                    log_string("[PWD][OK]Password accepted!\n");
                                    log_string("[PWD][OK]Authorized!\n");
                                  }     
                                  else if(strcmp(getpasswd,"jasmtest") != 0)
                                  {
                                     log_error("[PWD][DEN]Wrong password!\n");
                                     log_error("[PWD][DEN]Closing connection...\n");
                                     if (write(client_sockfd,denied,sizeof(denied)) < 0)
                                       log_error("[core/ipc.c][start_server()][getpasswd][write()] ERROR while sending denied\n");
                                  }
                                }
                                else
                                {
                                  write(client_sockfd,not_required,sizeof(not_required));
                                  log_string("[CLIENT-AUTH]Authentication NOT required!");
                                }

这是我解释的“客户端”:直到写入(sockfd,get_my_pass,sizeof(get_my_pass));一切正常,当我打电话:阅读(sockfd,回答,尺寸(答案))它不再工作,如上所述 .

read(sockfd,get_msg_from_server,255);

        if(strcmp(get_msg_from_server, "auth-required") == 0)
        {
          printf("+-----------------------------------------------------------------------+\n");
          printf("* Authentication is required before accessing JASM Command Line Interface\n");
          printf("* Password: \n");

          write(sockfd,get_my_pass,sizeof(get_my_pass));
          if(read(sockfd,answer,sizeof(answer)) < 0)
           printf("* Error on read\n");

          if(strcmp(answer,"denied") == 0)
          {
              printf("* Non-authorized access!!\n");
              printf("* Exiting...\n");
              close(sockfd);
              exit(3);
          }

        }
        else if(strcmp(get_msg_from_server, "auth-not-required") == 0)
          printf("* Authentication is not required for this session\n");

感谢你们所有的:)

1 回答

  • 2

    在大多数情况下,您不会检查 read()write() 调用的返回值 . 如果要传输多个字节,这始终是一个错误,即使没有发生I / O错误,这些函数也无法保证传输指定的字节数 . 该数字给出了将要转移的最大值;您需要准备好在多个呼叫上传输所需的字节 .

    此外,在大多数情况下,您需要某种协议,每个读者可以通过该协议预测要读取的字节数 . 如果您要发送固定长度的消息,那么作者和读者必须就消息长度达成一致;如果您要发送可变长度的消息,则需要每个消息显式消息长度(本身是固定长度的组件)或读取器可以识别的消息终止符 .

    你的情况有点说明 . 这由服务器写:

    write(client_sockfd,auth,sizeof(auth));
    

    似乎打算与客户端的这个读取配对:

    read(sockfd,get_msg_from_server,255);
    

    但请注意, auth 声明为 char auth[256] ,因此其大小为 256 . 假设服务器确实写入了所有256个字节(正如我所说,不能保证),客户端最多只能读取 255 ,至少有一个等待,未读 . 下一个读取(进入 answer )将从该未读字节开始 . 它将是 0 (给定为 auth 提供的初始值设定项),因此 answer 将被解释为空字符串,尽管初始 '\0' 之后可能有任何字节 .

    实际上,即使服务器成功传输少于256个字节,如果它甚至传输了一个以上,以便客户端将消息识别为包含字符串 "auth-required" ,那么客户端读取的下一个字节将始终具有值零 .

相关问题