c语言 - 在 tcp 服务器中,select() 每秒调用一次。当两个或多个数据包到达时如何区分它们"1 second"?



我每1秒调用一次select系统调用。如果两个或多个数据包在一秒内到达。read()将其视为一个数据包。我想知道有多少已经到达,并分别阅读每个包?请通过不减少该时间"1秒"来解决该问题。

TCP是一个流式协议,它不会在应用程序级别公开单个数据包。

如果您需要处理单个数据包,则需要切换到数据报协议,例如UDP,它是为这种用途而设计的。然而,请注意,这将需要更改发送方和接收方代码,以及重新设计协议以手动处理重传。

你做错了,否则你需要更多地描述你在做什么。您通常会尽可能频繁地调用select(),并阻止等待输入。为什么你在1秒时随机夹紧?每当您收到可读性通知时,您总是贪婪地阅读,直到您得到EWOULDBLOCK/EAGAIN,这时您将返回select()等待更多输入。

对于TCP,您可以定义一个协议头并将大小放入其中(需要定义1、2或4个字节)。对于每个有信号的套接字,您可以执行步骤

  1. read header-size="header size"(必须是常量)
  2. 从标题中获取"数据大小"
  3. 读取数据大小=数据大小(来自步骤2)
  4. 处理数据包
  5. 如果还有更多内容要读回到步骤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 

现在你有一个完整的数据包可以处理了。

最新更新