V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
bccber
V2EX  ›  问与答

UDPServer 有必要使用 select 模型吗?

  •  
  •   bccber · 2017-10-04 00:09:30 +08:00 · 3114 次点击
    这是一个创建于 2639 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚开始学习 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(...);
    	}
    }
    
    1 条回复    2017-10-04 00:14:57 +08:00
    choury
        1
    choury  
       2017-10-04 00:14:57 +08:00
    你要是就一个 socket 还 select 啥啊,你要是同时 recvfrom 好多 fd,那就要了,示例代码只是给你一个框架罢了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1054 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:56 · PVG 03:56 · LAX 11:56 · JFK 14:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.