今天使用select编程,问题很多,以前真的没有仔细研究过。
出现了以下几个问题
1 recvfrom在接收时,提供给系统调用的最后一个参数,客户端的地址结构,其长度必须进行初始化,如果为0,则不能接收数据。
2 select的第一个参数为所有监视的文件描述符的最大值+1,而不是监视的文件描述符个数+1。
3 不要监视那些经常可用的文件描述符,如果这样做,select会一直返回。
4 在select返回后,如果监视的文件描述符没有状态改变,则在fd_set中此文件描述符会被清0,因此在select的循环中,每次进入都要重新设置我们所关注的文件描述符。
5 如果select使用了超时操作,每次返回select都会修改计时器,将计时器设为余下的时间,因此如果使用了计时器,每次进入循环都要重置计时器。pselect没有这个毛病。

 

下面是linux下的基于select的一个UDP反射服务器的示例代码:

 

 

 

 

下面是一个python的UDP反射客户端

 

Logo

更多推荐