当我尝试在C中的服务器和客户端之间交换消息时遇到了问题。
服务器
char username[50],parola[50];
bzero(username,50);
strcpy(mTrimis,"Enter message");
//this is working fine
if(write(client,mTrimis,sizeof(mTrimis))<=0)
{
perror ("[server]Error1\n");
continue;
}
//this is working fine
if(read(client,username,sizeof(username))<=0)
{
perror("[server]Error1r\n");
continue;
}
bzero(parola,50);
bzero(mTrimis,500);
strcpy(mTrimis,"Enter password");
//this is working fine
if(write(client,mTrimis,sizeof(mTrimis))<=0)
{
perror ("[server]Error2\n");
continue;
}
//this "read" is not working
if(read(client,parola,sizeof(parola))<=0)
{
perror("[server]Error2\n");
continue;
}
bzero(mTrimis,500);
printf("%s-%s\n",username,parola);
客户端
bzero(mTrimis,500);
bzero(mPrimit,500);
if(read(sd,mPrimit,sizeof(mPrimit))<0)
{
perror ("[client]Error1 client)\n");
return errno;
}
printf ("MESSAGE SERVER:\n%s\n",mPrimit);
if(read(0,mTrimis,sizeof(mTrimis))<0)
{
perror ("[client]error client-keyboard\n");
return errno;
}
if(write(sd,mTrimis,sizeof(mTrimis))<0)
{
perror ("[client]Error1 client->server\n");
return errno;
}
bzero(mTrimis,500);
bzero(mPrimit,500);
if(read(sd,mPrimit,sizeof(mPrimit))<0)
{
perror ("[client]Error2 cleint\n");
return errno;
}
printf ("MESSAGE SERVER:\n%s\n",mPrimit);
if(read(0,mTrimis,sizeof(mTrimis))<0)
{
perror ("[client] error2 client keyboard\n");
return errno;
}
if(write(sd,mTrimis,sizeof(mTrimis))<0)
{
perror ("[client]Error2 client->server\n");
return errno;
}
因此服务器要求客户端输入用户名并接收用户名。然后,它要求输入密码,在这里(第二次“读取”)它无法正常工作。它只是通过这个“读取”,它将打印类似“user123-”的东西,并将断开客户端,因为它到达代码的末尾。
在客户端,它从服务器获取要求输入用户名的消息,然后客户端将其消息发送到服务器。然后它从服务器获取第二条消息,要求输入密码,并且无法将第二条消息发送回服务器,我收到“error2 client-&gt; server”错误(因为它已断开连接)。 / p>
答案 0 :(得分:1)
检查客户端上用于将数据发送到服务器端缓冲区大小的缓冲区大小以获取数据。线索在那里。
客户端:
bzero(mTrimis,500);
用于在第一个if(read(client,username,sizeof(username))<=0)
中写入用户名。您正在写char username[50]
因此,socket上有500个字节。
服务器:
获取用户名时读取了多少?
read
只需50 sizeof
因此服务器不会读取客户端发送的整个字节。
下次你在服务器上调用write
时,你正在读取500字节的剩余部分 - 这次也只是50字节 - 这些都是零。因此你看到的行为。
解决方案:
从标准输入读取后,不使用n = read(0,mTrimis,sizeof(mTrimis));
中的if(write(sockfd,mTrimis,n)<0)
缓冲区,而是使用用户输入的实际字节数。
{{1}}
{{1}}