连续两次读取套接字,第二次读取不起作用
Two consecutive socket reads, second read not working
下面我有一个来自服务器代码和客户端代码的代码段。我的客户端向服务器发送一个整数,该整数成功接收,然后我向服务器发送长度为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 : %sn", 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("%sn",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)
。你也必须处理这种情况。
从套接字读取255字节的str长度,从而获取数据的前251个(假设为32位整数)。因此,当你要求字符串的其余部分时,你要求额外的251个字节,这些字节没有发送,因此读取调用会被阻止。
将长度读取为整数
unsigned int length;
n=read(newsockfd,&length, sizeof(length));
在您当前的代码片段中,您没有删除长度
unsigned int *length = new unsigned int;
这将导致小的存储器泄漏。
正如Rob在回答中所说,您应该检查读取的返回字节数,而不仅仅是检查返回的错误
相关文章:
- 套接字读取后,我在缓冲区中看到意外输入
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 从Qt上的UNIX域套接字(QLocalSocket)读取
- 不要从输入队列套接字读取数据
- 如何读取套接字编程(c ++)中的所有数据?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- boost::asio-async_read_some示例代码没有读取套接字中的所有数据
- 使用RAW套接字读取ICMP响应
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- UDP 套接字读取最后一个传入字节
- CAN套接字读取帧较晚
- Java 套接字读取在第二次读取时返回奇怪字符
- 如何使用 recv 或 C++ 中的读取功能从 tcp 套接字读取大请求
- 如何在读取时获取套接字流的位置
- 无法在java(客户端)的套接字上正确写入数据(类),也无法在c ++(服务器)上读取数据(类)
- C/C++:写入和读取套接字
- 如何正确读取套接字消息(C++)
- 如何读取套接字消息
- 连续两次读取套接字,第二次读取不起作用