【发布时间】: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