C中TCP服务器和客户端之间的通信
Communication between TCP server and client in C
我在尝试用 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;
}
所以服务器正在向客户端询问用户名并接收它。然后,它要求输入密码,这里(在第二个 "read")它不能正常工作。它只是通过这个 "read",它会打印类似这样的东西 "user123-" 并且会断开客户端,因为它到达了代码的末尾。
在客户端,它从服务器获取请求用户名的消息,然后客户端将其消息发送到服务器。然后它从服务器获取第二条消息,要求输入密码,但无法将第二条消息发送回服务器,我收到 "error2 client->server" 错误(因为它已断开连接)。
查看发送数据到服务器端获取数据的缓冲区大小。线索就在那里。
客户:
if(write(sd,mTrimis,sizeof(mTrimis))<0)
用于在第一个写用户名write
。您正在写至少 500 个字节 bzero(mTrimis,500);
因此,套接字上有 500 个字节。
服务器:
获取用户名的阅读量是多少?
if(read(client,username,sizeof(username))<=0)
char username[50]
仅剩 50 人
因此服务器不会读取客户端发送的整个字节。
下次您在服务器上调用 read
时,您将读取剩余的 500 个字节——这次也只有 50 个——全为零。因此你看到的行为。
解决方案:
从标准输入读取后,不要使用 sizeof
write
中的缓冲区,而是使用用户输入的实际字节数。
n = read(0,mTrimis,sizeof(mTrimis));
if(write(sockfd,mTrimis,n)<0)
我在尝试用 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;
}
所以服务器正在向客户端询问用户名并接收它。然后,它要求输入密码,这里(在第二个 "read")它不能正常工作。它只是通过这个 "read",它会打印类似这样的东西 "user123-" 并且会断开客户端,因为它到达了代码的末尾。
在客户端,它从服务器获取请求用户名的消息,然后客户端将其消息发送到服务器。然后它从服务器获取第二条消息,要求输入密码,但无法将第二条消息发送回服务器,我收到 "error2 client->server" 错误(因为它已断开连接)。
查看发送数据到服务器端获取数据的缓冲区大小。线索就在那里。
客户:
if(write(sd,mTrimis,sizeof(mTrimis))<0)
用于在第一个写用户名write
。您正在写至少 500 个字节 bzero(mTrimis,500);
因此,套接字上有 500 个字节。
服务器:
获取用户名的阅读量是多少?
if(read(client,username,sizeof(username))<=0)
char username[50]
因此服务器不会读取客户端发送的整个字节。
下次您在服务器上调用 read
时,您将读取剩余的 500 个字节——这次也只有 50 个——全为零。因此你看到的行为。
解决方案:
从标准输入读取后,不要使用 sizeof
write
中的缓冲区,而是使用用户输入的实际字节数。
n = read(0,mTrimis,sizeof(mTrimis));
if(write(sockfd,mTrimis,n)<0)