两次连续读取,第二次读取不起作用

Mik*_*e G 0 c c++ tcp

下面我有一个来自我的服务器代码和客户端代码的代码段.我的客户端向服务器发送一个成功接收的整数,然后我将一个长度为str_len的字符串发送到服务器.服务器中的第二次读取不起作用,它阻塞而不读取任何内容.当我退出客户端时,服务器打印出它没有读取任何内容.怎么了?

            //Server code

            bzero(buffer,256);
            n = read(newsockfd,buffer,255);
            if (n < 0) error("ERROR reading from socket");
            unsigned int *length = new unsigned int;
            memcpy(length, buffer, sizeof(int));
            cout << "Length : " << *length << endl;
            int len = *length + 1;
            char buffIn[len+1];
            bzero(buffIn,len);
            //ok msg?
            n = read(newsockfd,buffIn,len);
            if (n < 0) error("ERROR reading from socket");
            cout << "value of n" << n << endl;
            printf("Received : %s\n", buffIn);


            //client method

            void send(string req)
            {
                //Send string len
                unsigned int str_len = req.length();
                //str_len = 3000;
                write(socketFd, &str_len, sizeof(str_len));
                //Send string
                const char *str_req = req.c_str();
                printf("%s\n",str_req);
                cout << "Str len is : " << strlen(str_req) << endl;
                write(socketFd, str_req, strlen(str_req) + 1);
                cout << "write done " << endl;
            }
Run Code Online (Sandbox Code Playgroud)

Rob*_*obᵩ 5

考虑这一行:

n = read(newsockfd,buffer,255);
Run Code Online (Sandbox Code Playgroud)

你从来没有检查过的精确值n.您检查函数是否失败,但不检查是否读取了多少字节.提示:在你的情况下,它不止于此sizeof (int).

试试这个:

n = read(newsockfd, buffer, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

Nb:在其他情况下,它也可能不到sizeof(int).你也必须处理这个条件.

  • 关于读取字节的非常好的注意事项可能小于所请求的字节 (2认同)