0

我正在使用 UDP 套接字将数据发送到我的 openGL 应用程序。openGL 应用程序应该在glutTimerFunc回调中监听 UDP 套接字并根据接收到的数据更新视图。

我的主要功能:

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);

    glutInitWindowSize(600, 600);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);

    glutCreateWindow("test");

    glutDisplayFunc(display);    
    glutReshapeFunc(reshape);
    glutTimerFunc(1000, listenToUDP, 0); // here!

    glClearColor(0,0,0,1);

    glutMainLoop();
    return 0;
}

我的 glutTimerFunc 回调,它监听 UDP 套接字:

void listenToUDP(int = 0)
{
    int sockfd,n;
    struct sockaddr_in servaddr,cliaddr;
    socklen_t len;
    char mesg[1000];

    sockfd=socket(AF_INET,SOCK_DGRAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(32000);
    bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));


    len = sizeof(cliaddr);
    printf("1");

    // here is the problem !!
    n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len); 

    printf("2");
    sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
    printf("-------------------------------------------------------\n");
    mesg[n] = 0;
    printf("Received the following:\n");
    printf("%s",mesg);
    printf("-------------------------------------------------------\n");

    map<string, float> info = parseInfo(mesg);
    scaleX += info.find("x") -> second;
    printf("%f", scaleX);

    glutPostRedisplay();
    glutTimerFunc(1000, listenToUDP, 0);
}

当我第一次向应用程序发送数据时,它工作得很好。它等待我标记的行上的数据,并在我向其发送数据后打印所有内容并相应地更新视图。

但是,自从我第二次向它发送数据以来,它就不起作用了。它会打印“1”但从不打印“2”,这意味着它暂停在我标记的行上。当然,它也不会更新视图。

如果 UDP 侦听器是独立的(使用无限循环运行它),我确信 UDP 侦听器运行良好,所以我猜这是与glutTimerFun. 然而,我完全不知道。

我的问题是:

1)这种行为的原因是什么?

2)我该如何解决?

4

1 回答 1

4

请使用 & 运算符获取函数的地址。

glutTimerFunc(1000, &listenToUDP, 0);

还请记得每次使用完后关闭socket:

close(sockfd);
于 2013-06-07T16:20:40.790 回答