我正在尝试使用
从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");
感谢你们所有人:)
答案 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"
,那么客户端读取的下一个字节将始终具有零值。