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)