openGL - 通过 glutTimerFunc 中的套接字获取数据时出现问题

Bri*_*ian 0 c++ sockets opengl glut

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

我的主要功能:

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;
}
Run Code Online (Sandbox Code Playgroud)

我的 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

我确信 UDP 监听器如果是独立的(以无限循环运行),它会工作得很好,所以我猜这是与glutTimerFun. 但是,我完全不知道。

我的问题是:

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

2)我该如何修复它?

Tom*_*hen 5

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

glutTimerFunc(1000, &listenToUDP, 0);
Run Code Online (Sandbox Code Playgroud)

还请记住每次使用后关闭套接字:

close(sockfd);
Run Code Online (Sandbox Code Playgroud)