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

时间:2015-12-02 17:08:05

标签: c linux sockets

我正在尝试使用

从socket fds发送数据/读取数据

write()和read()函数。

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

write()将数据发送到" sockfd" - > "的sockfd"将数据插入"回答"变量与read()函数

问题是,当我试图获得答案的内容时 (使用通常的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!");
                                }

这是&#34;客户&#34; 我解释: 直到写(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 个答案:

答案 0 :(得分: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个字节,至少有一个等待,未读。 next 读取(进入answer)将从该未读字节开始。它将是0(给定为auth提供的初始值设定项),因此answer将被解释为空字符串,尽管初始'\0'之后可能有任何字节。

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