免费注册 查看新帖 |

Chinaunix

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

◎ 关于 alarm 和 socket 求助!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-17 14:22 |只看该作者 |倒序浏览
1、我的以下代码在一个函数中,我想通过 alarm 控制超时,其实就是没有哪个给它发送信息的时候,也就是 recvfrom 永远不可能接受到东西的时候,通过 alarm 函数控制超时。但是 my_sig_alarm()函数被正常调用呢,但程序不能继续进行下去,甚至连紧跟在 recvfrom后面的 fprintf都不能显示。我开始怀疑是 alarm时间短了CPU还没运行到recvfrom来alarm就执行了,我把时间设长了一样不行。

请大家帮忙看看是什么原因!谢谢!

{
alarm(1);

recvfrom(regsock, getbuf, sizeof(getbuf), 0, (struct sockaddr *)&sin, (socklen_t*)&sinlen);
//fprintf(stderr, "recvfrom";

alarm(0);

if (ALARM) {
````
}
}

static void my_sig_alarm(int signo)
{
ALARM = TRUE;
fprintf(stderr, "Alert: sig_alarm()...\n";
return;
}


2、如何一个程序非正常退出(如:ctrl+c),如何释放它所占用的 socket?

论坛徽章:
0
2 [报告]
发表于 2005-10-17 14:35 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

建议使用alarm、setjmp来实现。例子在论坛上能找到。

论坛徽章:
0
3 [报告]
发表于 2005-10-17 15:04 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

搜索报告:
对不起,本站全文检索功能暂不开放!
开放时间:周一至周五,每天18:00-8:00,周六日全天。(1|14)
没法,自己写了


我把setjmp加上还是不行


setjmp(env_alarm);


alarm(1);

recvfrom(regsock, getbuf, sizeof(getbuf), 0, (struct sockaddr *)&sin, (socklen_t*)&sinlen);
//fprintf(stderr, "recvfrom";

alarm(0);

if (ALARM) {
````
}


static void my_sig_alarm(int signo)
{
ALARM = TRUE;
fprintf(stderr, "Alert: sig_alarm()...\n";
longjmp(env_alarm, 1);
return;
}

程序还是不能继续进行下去,甚至连紧跟在 recvfrom后面的 fprintf都不能显示。

论坛徽章:
0
4 [报告]
发表于 2005-10-17 15:08 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

而如果把 recvfrom 改为 pause() 或者其他如:sleep(100) 之类的就能正常执行,不知为什么啊?

大虾帮帮我··················

论坛徽章:
0
5 [报告]
发表于 2005-10-17 15:11 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

不是这样用的!你可以man setjmp,有例子的

论坛徽章:
0
6 [报告]
发表于 2005-10-17 15:21 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

咦?我的 man  setjmp怎么没有例子啊?

我上面的程序基本上是按照《UNIX 环境高级编程》的例子做的啊
你有没有例子,贴上给我看看

论坛徽章:
0
7 [报告]
发表于 2005-10-17 15:24 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

这是我的源码,你看看

int ALARM =0;

static jmp_buf env_alarm;


static void my_sig_alarm(int signo);

int main(int argc, char *argv[])
{
        int sock;
        struct sockaddr_in sin;
        int sinlen = sizeof(sin);
        char getbuf[256];
        int i=0;
        c_timeval timeo;
       
        timeo.tv_sec = 10;
        timeo.tv_usec = 0;


        signal (SIGALRM, my_sig_alarm);

        if (setjmp(env_alarm) <0) {
                fprintf (stderr, "setjmp error\n";
                return -1;
        }

        sock = socket(AF_INET, SOCK_DGRAM, 0);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(9999);
        sin.sin_addr.s_addr = htonl (INADDR_ANY);

        bind(sock, (struct sockaddr *)&sin, sinlen);
       
        /*
        if (setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, &timeo, sizeof(timeo)) <0) {
                fprintf(stderr, "setsockopt error, errno=%d\n", errno);
                return -1;
        }
        */

        alarm (1);

        if (recvfrom(sock, getbuf, sizeof(getbuf), 0, (struct sockaddr *)&sin, (socklen_t*)&sinlen) <0) {
                fprintf (stderr, "recvfrom errno, errno=%d\n", errno);
                close(sock);
                return -1;
        }

        alarm (0);

        if (ALARM) {
                fprintf(stderr, "Alarm, after recvfrom \n";
                close(sock);
                return 0;
        }
       
        fprintf(stderr, "normal timeout and exit\n";
        close(sock);
        return 0;
}

static void my_sig_alarm(int signo)
{
//        signal (SIGALRM, my_sig_alarm);
        ALARM = 1;
        fprintf(stderr, "Alert: sig_alarm()...\n";
        longjmp(env_alarm, 1);
        return;
}

论坛徽章:
0
8 [报告]
发表于 2005-10-17 15:35 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

对于socket的接收用select 可能会更好.

我手上没例子,可以先搜搜.

论坛徽章:
0
9 [报告]
发表于 2005-10-17 15:46 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

主要是为了实现一个超时功能,recvfrom 如果超时(其时有可能永远接受不到,因为没有程序给它发),就执行下面的。

我改用 setsockopt 算了
原本以为 alarm 简单些。想不通,和书上一样的程序就是运行不对,alarm功能体现不完全。郁闷中······

论坛徽章:
0
10 [报告]
发表于 2005-10-17 15:52 |只看该作者

◎ 关于 alarm 和 socket 求助!!!!!

再来一个问题如下:

如何一个程序非正常退出(如:ctrl+c),如何释放它所占用的 socket?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP