我想用原始套接字写一个类似ping的程序,里面有一行是recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);但是程序在运行时出现问题:现象是,能够到达的ip程序正常工作,不能到达的ip程序就不动了,好像死掉一样,我调了一下发现程序停在了上面那行语句。我已经设置了超时为1秒,但是10分钟也没有返回。请各位大侠救命啊!!

解决方案 »

  1.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=203385
      

  2.   

    http://community.csdn.net/Expert/topic/3577/3577514.xml?temp=.6634485
      

  3.   

    厉兵秣马 给的帖子我看了,但是我是想用JNI进行一下封装,所以还不知道能不能把CPING类成功的封装;勇敢的心说的timer计时的方法我也考虑过,只是不知道java下的多线程怎么用;唉,说道底还是我太菜了。我希望能够把recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);正确的设置超时,在一秒钟内能够返回,谢谢各位大侠了,继续期待中。
      

  4.   

    //set Recv and Send time out
    int TimeOut=6000; //设置发送超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }
    TimeOut=6000;//设置接收超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
    return 0;
    }
      

  5.   

    请教kingzai() 一个问题:我的程序也设置了这个延时,是这样写的setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout, 
    sizeof(timeout)),但是超时后recvfrom函数并没有返回错误,而是一直阻塞。我看到有些帖子说需要设置异步模式取消阻塞,请问如果用异步模式,recvfrom在超时后会怎样?呵呵,我好像看到希望了。
      

  6.   

    unix网络编程 UDP高级编程这几章是有讲超时这个问题的,好象是这么写。
    int readable_timeo(int fd, int sec)
    {
        fd_set rset;
        struct timeval tv;    FD_ZERO(&rset);
        FD_SET(fd, &rset);
        tv.tv_sec = sec;
        tv.tv_usec = 0;    return (select(fd+1, &rset, NULL, NULL, &tv));
    }
    对readable_timeo的调用实例
    void dg_cli(FILE *fp, int sockfd, const struct sockaddr *pservaddr,
        socklen_t servlen)
    {
        int n;
        char sendline[MAXLINE],recvline[MAXLINE+1];    while (fgets(sendline, MAXLINE, fp)!=NULL){
            sendto(sockfd, sendline, strlen(sendline),0,pservaddr,servlen);
            if (readable_timeo(sockfd,5)==0){
                fprintf(stderr,"socket timeout\n");
            }else{
                n = recvfrom(sockfd,recvline,MAXLINE,0,NULL,NULL);
                recvline[n]=0;  /* null terminate */
                fputs(recvline,stdout);
            }
        }
    }