刚开始学习 linux 网络编程 照着书本抄了两份 UDPServer 的代码, 一份直接使用 recvfrom 一份在前面顶着一个 select,也大概明白 select 的好法,传入 sockfd+1,然后系统会判断是否有可读写的 sockfd,有能进行下一步,没有就阻塞到超时。
select 在下面的代码中起来的作用有多大? 有没有必要?
伪代码如下: recvfrom:
while (true)
{
len = sizeof(cliaddr);
int n = recvfrom(sockfd, buf, 1024, 0, (struct sockaddr *) &cliaddr, &len);
// 有数据来,放入队列,立即返回下一轮
PushQueue(...)
}
select 模型:
while (true)
{
FD_SET(sockfd, &fdset);
if (select(sockfd + 1, &fdset, &fdset, &fdset, &tv))
{
len = sizeof(cliaddr);
int n = recvfrom(sockfd, buf, 1024, 0, (struct sockaddr*) &cliaddr, &len);
// 有数据来,放入队列,立即返回下一轮
PushQueue(...);
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.