【问题标题】:How to implement infinite loop如何实现无限循环
【发布时间】:2012-05-18 15:44:02
【问题描述】:

实现 IRC 客户端(仍然)。 我几乎拥有所有东西,但今天我注意到,有一个主要问题。
我得到了服务器发送给我的所有数据,但如果我只在显示发送给我的数据后等待,我的while(1) 循环只检查一次是否有更多数据要接收然后停止。仅当我键入并发送某些内容时才重新开始,而不是在发送我键入的内容后检查是否有任何数据在套接字上等待并最终显示它。
这显然是错误的,因为在这种情况下,我看到之前收到的消息,只有当我发送一些东西时。
这是我的代码:

while(1){    
  if((readReady = readReadiness(sockfd))==0){    //nothing to recv
          if(((writeReady = writeReadiness(sockfd))>0) && (readReady = readReadiness(sockfd))==0){  //sending is possible  
                (data sending part...)  
          }
          else
                continue; //if there s no data to read and cant send
          }
  else{         //if there s some data to recv() on the socket buffer 
          (parsing and receiving data part...)  
   } 
    continue;
}

readReadiness()writeReadiness() 使用select() 检查是否有任何数据要接收或可能发送一些数据。

问题是:如何创建无限循环来重复检查是否有任何数据要接收,即使我什么也不做。 ? (while(1) 在我再次发送之前停止检查)
我尝试使用fork(),但我不知道如何让它工作并汇集数据,同时仍然让我有可能发送/接收和显示它。

【问题讨论】:

  • 当我看到问题标题时,我认为这将是一个容易回答的问题。
  • 这是一种非常扭曲的做事方式。人们通常会围绕 single 选择调用。看起来你每次最多可以做三个,而且逻辑看起来很脆弱。
  • 它在链式发送-接收-发送-接收等方面表现出色。所以逻辑并不是很脆弱。问题是如何改变它或使用什么功能使其能够像接收接收接收接收发送接收接收等等......

标签: c sockets infinite-loop irc pooling


【解决方案1】:

在您的 while(1) 循环中,您可以定期“戳”服务器以获取新内容。响应将更新您的套接字的内容。这将触发套接字缓冲区上的 recv() 有数据...

【讨论】:

  • 想过这样做,但你承认这似乎是一个野蛮的解决方案。我想到的第一件事是 - 如果我的 while 循环停止,我怎么能定期戳它?如果我可以定期戳它,那么我可以定期检查是否还有要接收的数据;)所以我看到了 - 它什么也没解决。
  • 你可以使用 while(1=1) 来确保你有一个无限循环。您的 while(1) 可以解释为只执行一次。然后使用睡眠(以毫秒为单位的时间)。这将强制线程等待。然后向套接字添加一些您将忽略的内容,并检查您是否还有更多数据要显示。是的,我知道这不是他最好的方法。
  • 我只是想。 IRC 服务器如何向您发送数据。定期或您必须要求提供数据?
  • 如果有要发送的数据,它会在服务器端发送数据:)。例如。我加入频道(有关频道的消息到达)比我看到人们在频道上相互发送的消息。它没有任何常规模式。
  • 如果我错了,请纠正我,但 while(1) 是 while(true),这与 while(1==1) 相同,它总是正确的。 (您的意思是比较(==),而不是分配(=)对吗?)无论如何,我会检查您的建议是否有效。
猜你喜欢
  • 2013-08-03
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多