免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1741 | 回复: 0
打印 上一主题 下一主题

查看局域网内所有在线的ip [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-15 09:39 |只看该作者 |倒序浏览
/*
   需求: adsl拨号上网,路由器上连了几台电脑,夜里睡觉之前看看有没有其他的电脑还连在局域网上,没有的话就关猫。都是限时上网惹的货
   原理:ping最简单的,但是其他电脑有可能有防火墙会屏蔽icmp消息的,所以就不行了。需要高层的tcp或者udp。现在用tcp,连接一个端口,根据返回的错误(0成功电脑开着, 111失败端口未开电脑还是开着, 113失败无法路由电脑关了)进行判断就ok了。
   关键:需要设置connect超时,电脑关了(不存在的ip)情况下,局域网可能还好会比较块的返回错误113.但是外网地址一般都要花75秒左右才能返回超时。原因我不说了
   作者:林汉杰2008-7-15  
   环境:g++
*/



#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "unistd.h"
#include "sys/types.h"
#include "sys/time.h"
#include "sys/socket.h"
#include "arpa/inet.h"
#include "netinet/in.h"
#include "netdb.h"
#include "fcntl.h"
#include "errno.h"

int main() {

        struct timeval timeout;
        fd_set wset;
        char straddr[100];
        for(int i=1; i 0) {
                                        int optval;
                                        int optlen = 4;
                                        if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (void*)&optval, (socklen_t*)&optlen)

ps:关于connect的select超时问题
select的返回值
0: 已经到了自己设置的timeout超时了
>0:一个或者多个描述符准备好读写或者有异常带外数据到来
可读情况:1.tcp接受缓冲区大于getsockopt SO_RCVLOWAT的值 2.有新的已经完成3次握手的连接放入接收队列 3.对方关闭写端读到0字节 4.非阻塞connect失败通过getsockopt获得错误 5.有错误比如rst,通过read返回错误
可写情况:1.tcp发送缓冲区数据大于sndlowat的值 2.本端主动关闭写端,write返回错误 3.非阻塞connect失败通过getsockopt获得错误 4.非阻塞connect成功,套接字可写 5.有错误rst,通过write返回错误
异常情况:收到带外数据
-1:比如被信号中断等等

以上所见:非阻塞connect的sockfd, 连接成功的时候sockfd只能写。但是连接失败的时候sockfd既可以读也可以写。所以总结起来,select非阻塞的connect的方案有两种:
1. 将sockfd加入rdset wrset,select返回时如果只有wrset被设置则连接成功。如果wrset rdset同时被设置则连接失败。通过getsockopt获得错误码判断具体是什么错误。
2.将sockfd加入wrset,连接成功失败都会返回。通过getsockopt获得错误码判断是否成功。
3.将sockfd加入rdset,连接成功不会返回,无效!!!

强烈注意:一定通过getsockopt获得错误码判断具体是什么错误。否则将会有很大的错误。我的理解,select返回-1就会设置errno,但是connect失败的时候select已经成功的返回了>0,所以就不应该设置errno了,但是又接收到了错误,所以内核就setsockopt SO_ERROR了,然后等待应用程序自己获取这个错误。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/62281/showart_1081953.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP