Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C read()或write()函数不工作_C_Linux_Sockets - Fatal编程技术网

C read()或write()函数不工作

C read()或write()函数不工作,c,linux,sockets,C,Linux,Sockets,我正在尝试使用从套接字fds发送数据/读取数据 write()和read()函数 问题是其中一个工作不正常,我解释说: write()将数据发送到“sockfd”->“sockfd”使用read()函数将数据插入“answer”变量 问题是当我试图得到答案的内容时 (使用通常的printf(“%s\n”,answer)),它是空的 我不知道问题是来自read()还是write(),如果两者都失败,则返回-1,因此我添加了一个简单的检查,查看其中一个是否返回

我正在尝试使用从套接字fds发送数据/读取数据

write()和read()函数

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

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

问题是当我试图得到答案的内容时 (使用通常的printf(“%s\n”,answer)),它是空的

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

代码如下:

这一个是发送方,最后一个write()调用出现了问题 [This:if(write(client_sockfd,denied,sizeof(denied))<0]

if(需要登录(客户端IP地址)==1)
{
char getpasswd[256];
字符身份验证[256]=“需要身份验证”;
已授予字符[9]=“已授予”;
字符被拒绝[7]=“被拒绝”;
//检查密码文件是否存在!
//检查密码文件(“密码文件”,客户机密码);
日志字符串(“[CLIENT-AUTH]需要身份验证!”);
写入(客户端、验证、大小(验证));
读取(client_sockfd、getpasswd、sizeof(getpasswd));
//日志字符串(getpasswd);
//检查这里
if(strcmp(getpasswd,“jasmtest”)==0)
{
日志字符串(“[PWD][OK]接受密码!\n”);
日志字符串(“[PWD][OK]Authorized!\n”);
}     
else if(strcmp(getpasswd,“jasmtest”)!=0)
{
日志错误(“[PWD][DEN]密码错误!\n”);
日志错误(“[PWD][DEN]正在关闭连接…\n”);
if(写入(客户端_sockfd,拒绝,sizeof(拒绝))<0)
日志错误(“[core/ipc.c][start_server()][getpasswd][write()]发送被拒绝时出错\n”);
}
}
其他的
{
写入(客户端为sockfd,不需要,大小为f(不需要));
日志字符串(“不需要[CLIENT-AUTH]身份验证!”);
}
这是“客户” 我解释: 直到写入(sockfd,获取我的通行证,sizeof(获取我的通行证)); 当我调用:read(sockfd,answer,sizeof(answer))时,一切都在工作,正如我上面所描述的,它不再工作了

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");
read(sockfd,从服务器获取消息,255);
if(strcmp(从服务器获取消息,“需要身份验证”)==0)
{
printf(“+--------------------------------------------------------------------------------------+\n”);
printf(“*在访问JASM命令行界面之前需要进行身份验证\n”);
printf(“*密码:\n”);
写(sockfd,获取我的通行证,sizeof(获取我的通行证));
如果(读取(sockfd,answer,sizeof(answer))<0)
printf(“*读取时出错\n”);
if(strcmp(回答“拒绝”)==0)
{
printf(“*非授权访问!!\n”);
printf(“*退出…\n”);
关闭(sockfd);
出口(3);
}
}
else if(strcmp(从服务器获取消息,“不需要身份验证”)==0)
printf(“*此会话不需要身份验证\n”);

感谢所有u:)

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

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

你的情况有点说明问题。此操作由服务器执行:

write(client_sockfd,auth,sizeof(auth));
似乎打算与此配对,由客户端读取:

read(sockfd,get_msg_from_server,255);
但是,请注意,
auth
声明为
charauth[256]
,因此其大小为
256
。假设服务器确实写入了所有256个字节(正如我所说,这是不保证的),那么客户端最多读取其中的255个字节,至少有一个字节在等待,未读。下一次读取(进入
应答
)将从该未读字节开始。它将是一个
0
(给定为
auth
提供的初始值设定项),因此
answer
将被解释为一个空字符串,不管该初始值
'\0'
后面可能有多少字节


事实上,即使服务器成功传输的字节数少于256个,但如果服务器传输的字节数超过一个,足以让客户端将消息识别为包含字符串
“auth required”
,则客户端读取的下一个字节的值始终为零。

是否有任何读取和/或写入成功?我注意到在代码的服务器部分,首次使用读写操作无法检查返回值。根据套接字连接的实现方式,您可以
read(sockfd,get_msg_from_server,255);