下面我有一个来自我的服务器代码和客户端代码的代码段。我的客户端向服务器发送一个成功接收的整数,然后我将一个长度为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;
}
答案 0 :(得分:5)
考虑这一行:
n = read(newsockfd,buffer,255);
您从未随后检查n
的准确值。您检查函数是否失败,但不检查是否读取了多少字节。提示:在您的情况下,它超过sizeof (int)
。
请改为尝试:
n = read(newsockfd, buffer, sizeof(int));
N.b。:在其他情况下,它也可能小于sizeof(int)
。你也必须处理这个条件。
答案 1 :(得分:0)
从套接字读取255个字节读取str长度,从而拉入数据的前251个(假设为32位整数)。因此,当你要求字符串的其余部分时,你要求额外的251字节,而不是发送,因此读取调用块。
将长度读成整数
unsigned int length;
n=read(newsockfd,&length, sizeof(length));
在您当前的代码中,您不会删除长度
unsigned int *length = new unsigned int;
会导致内存泄漏。
正如Rob在他的回答中所述,你应该检查读取的返回字节数,而不仅仅是检查返回的错误