gpt4 book ai didi

C语言中TCP服务器与客户端的通信

转载 作者:行者123 更新时间:2023-11-30 15:13:38 24 4
gpt4 key购买 nike

当我尝试用 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”,它会打印类似“user123-”的内容,并会断开客户端连接,因为它到达了代码末尾。

在客户端,它从服务器获取请求用户名的消息,然后客户端将其消息发送到服务器。然后它从服务器获取第二条消息,即要求密码的消息,并且无法将第二条消息发送回服务器,我收到“error2 client->server”错误(因为它已断开连接)。

最佳答案

检查客户端用于发送数据的缓冲区大小和服务器端获取数据的缓冲区大小。线索就在那里。

客户:

if(write(sd,mTrimis,sizeof(mTrimis))<0)

用于在第一个write中写入用户名。您正在写入至少 500 个字节 bzero(mTrimis,500);

因此,套接字上输出了 500 个字节。

服务器:

获取用户名时读取了多少内容?

if(read(client,username,sizeof(username))<=0)

只有 50 人经过 char username[50]

因此服务器不会读取客户端发送的整个字节。

下次您调用read时在服务器上,您正在读取剩余的 500 个字节 - 这次也只有 50 个 - 全部为零。因此你会看到这样的行为。

解决方案:

从标准输入读取后,不要使用 sizeof write中的缓冲区,使用用户输入的实际字节数。

n = read(0,mTrimis,sizeof(mTrimis));

if(write(sockfd,mTrimis,n)<0)

关于C语言中TCP服务器与客户端的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34472732/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com