c++ - 两次连续的套接字读取,第二次读取不起作用

标签 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;
            }

最佳答案

考虑这一行:

n = read(newsockfd,buffer,255);

您永远不会随后检查 n 的精确值。您检查函数是否失败,但不检查读取了多少字节。提示:在您的情况下,它不仅仅是 sizeof (int)

试试这个:

n = read(newsockfd, buffer, sizeof(int));

注意:在其他情况下,它也可能小于 sizeof(int)。您还必须处理该情况。

关于c++ - 两次连续的套接字读取,第二次读取不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15047117/

相关文章:

用于删除 Map 和指针 vector 中的指针值的 C++ 通用代码

c++ - Purify 在使用 std::list::remove() 时揭示了潜在的空闲内存读取

c++ - 如何让 fmt::format 与 wchar_t 一起工作?

c++ - 局部变量可以与命名空间同名吗?

java - Android - 如何在服务重新启动时保留套接字连接

c# - 如何关闭 TCP/IP 连接

c - libcURL 混淆后

c - 可以在函数参数中声明一个数组吗?

c - 来自 UINT32_C、UINTN_C 的意外类型

networking - 我什么时候应该考虑使用 TCP 或 UDP?