我每1秒调用一次select系统调用。如果两个或多个数据包在一秒内到达。read()将其视为一个数据包。我想知道有多少已经到达,并分别阅读每个包?请通过不减少该时间"1秒"来解决该问题。
TCP是一个流式协议,它不会在应用程序级别公开单个数据包。
如果您需要处理单个数据包,则需要切换到数据报协议,例如UDP,它是为这种用途而设计的。然而,请注意,这将需要更改发送方和接收方代码,以及重新设计协议以手动处理重传。
你做错了,否则你需要更多地描述你在做什么。您通常会尽可能频繁地调用select()
,并阻止等待输入。为什么你在1秒时随机夹紧?每当您收到可读性通知时,您总是贪婪地阅读,直到您得到EWOULDBLOCK/EAGAIN,这时您将返回select()
等待更多输入。
对于TCP,您可以定义一个协议头并将大小放入其中(需要定义1、2或4个字节)。对于每个有信号的套接字,您可以执行步骤
- read header-size="header size"(必须是常量)
- 从标题中获取"数据大小"
- 读取数据大小=数据大小(来自步骤2)
- 处理数据包
- 如果还有更多内容要读回到步骤1
编辑:
如果我们假设这是你的标题:
struct header{
int data_size;
//add more things if u like
};
在你的代码中,你像往常一样阅读,但需要两个步骤:
int res;
header hdr;
unsigned char data[MAX_SIZE];
res = recv(s, hdr, sizeof(hdr),0);
//now res should be = sizeof(hdr)
res = recv(s, data,hdr->data_size,0);
//now res should be = hdr->data_size
现在你有一个完整的数据包可以处理了。