我正在使用 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)我该如何解决?