【问题标题】:Communication between TCP server and client in CC语言中TCP服务器和客户端之间的通信
【发布时间】:2015-12-26 15:35:53
【问题描述】:

我在尝试用 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->server”错误(因为它已断开连接)。

【问题讨论】:

  • 您确定“客户”已正确发送密码吗?
  • 您确定客户端没有问题吗?您是否尝试过从 read(client,parola,sizeof(parola))
  • @SACHINGOYAL 给我一点时间来编辑和添加一些细节(客户永远不会发送到消息)
  • @KLibby 在打印行代码之后,我得到类似“user-”的东西;我也试过没有这种情况,同样的问题。

标签: c tcp client-server read-write


【解决方案1】:

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

客户:

if(write(sd,mTrimis,sizeof(mTrimis))&lt;0)

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

所以,500 个字节在套接字上输出。

服务器:

在获取用户名时读取了多少?

if(read(client,username,sizeof(username))&lt;=0)

char username[50] 仅 50 人

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

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

解决方案:

一旦你从标准输入读取,而不是使用sizeofwrite 中的缓冲区,使用用户输入的实际字节数。

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

if(write(sockfd,mTrimis,n)&lt;0)

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 2015-05-06
    • 2013-08-24
    • 2021-08-23
    • 2014-05-10
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    相关资源
    最近更新 更多