免费注册 查看新帖 |

Chinaunix

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

使用AIO+SOCKET做UDP接收端后怎么获得客户端的sockaddr_in [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-27 23:46 |只看该作者 |倒序浏览
如题!
比如如下代码

void sig_handler(int signo, siginfo_t *info, void *context )
{
        int ret;
        struct aiocb *req;
        /* Ensure it's our signal */
        if (info->si_signo == SIGIO) {

                req = (struct aiocb *)info->si_value.sival_ptr;
                if (aio_error( req ) == 0) {
                        ret = aio_return( req );
                        (char*)(req->aio_buf+ret) == '\0';
                        //比如在这里想获得发送端的sockaddr_in该怎么办呢?

                        puts(req->aio_buf);
                }

        }

        return;        
}

int main()
{
        int skt_fd,ret;
        struct aiocb my_aiocb;
        struct sigaction sig_act;
        
        struct sockaddr_in addr;
        memset(&addr,0,sizeof(addr));
        addr.sin_family =  AF_INET;
        addr.sin_addr.s_addr = INADDR_ANY;
        addr.sin_port = htons(50001);
        
        
        skt_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if(skt_fd == -1)
        {
                perror("Create socket failed");
                exit(-1);
        }
        ret = bind(skt_fd,(struct sockaddr *)&addr,sizeof(addr));
        if(-1 == ret)
        {
                perror("Bind socket failed");
                exit(-1);
        }

        memset(&my_aiocb,0,sizeof(my_aiocb));
        my_aiocb.aio_buf = malloc(MAX_TRANSPORT_LENTH+1);        
        if (!my_aiocb.aio_buf)
                perror("malloc");
        
        my_aiocb.aio_fildes = skt_fd;
        my_aiocb.aio_nbytes = MAX_TRANSPORT_LENTH;
        my_aiocb.aio_offset = 0;
        
        my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
        my_aiocb.aio_sigevent.sigev_signo = SIGIO;
        my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb;

        //my_aiocb.aio_lio_opcode = LIO_READ;

        
        sigemptyset(&sig_act.sa_mask);
        sig_act.sa_flags = SA_SIGINFO;
        sig_act.sa_sigaction = sig_handler;        
        
        const struct aiocb *cblist[MAX_LIST] ={&my_aiocb,NULL,NULL,NULL,NULL};
        sigaction( SIGIO, &sig_act, NULL );
        
        ret = aio_read( &my_aiocb );           
        /*
        while (lio_listio(LIO_NOWAIT,cblist,MAX_LIST,NULL)==0)
        {
             ret = aio_read( &my_aiocb );
        }
        */

        //程序挂起直到等到某个信号

        while ( aio_suspend( cblist, MAX_LIST, NULL ) == 0)
        {
            ret = aio_read( &my_aiocb );
        };
        
        puts("Interrupted finish.");
        close(skt_fd);        
}


[ 本帖最后由 manyan1985 于 2008-5-28 08:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-28 09:56 |只看该作者
请哪位高手说说啊。!!!!!!

论坛徽章:
0
3 [报告]
发表于 2009-12-17 13:10 |只看该作者
严重关注!好像linux的异步IO只能用于STREAM套接字,IBM对AIO有一套扩展,可以支持的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP