我正在研究一个多线程UDP监听器,我陷入了一个绝对超越我的问题。
所以,我需要在几个端口接收大量的UDP数据包。在本地,最好的……
真是太棒了!
@molbdnilo是绝对正确的:
您正在使用指向生命周期结束的对象(& args)。 这有不确定的行为 - 它似乎可行,但它是一个错误 这需要一个固定'。
这是固定代码。在为线程提供参数时要小心!
void receiveFromSocket(void * arguments){ sockaddr_in client; // Local socklen_t clientSize = sizeof(client); memset(&client, 0, sizeof(client)); struct arg_struct_listenPort *args2 = (struct arg_struct_listenPort *)arguments; int fd = args2->arg_fd; int port = args2->arg_port; for(;;) { char buf[158]; memset(buf,0,158*sizeof(char)); int n = recvfrom(fd, (char * ) buf, 158, MSG_WAITALL, ( struct sockaddr *) &client, &clientSize); if(n == -1){ cerr << "Error while receiving from client: " << errno << endl; continue; } if(n != 158){ cerr << "Discarded message since it's not 158 bytes." << endl; continue; } arg_struct *args = new arg_struct; args->arg_port = port; memcpy(args->buf,buf,158); thpool_add_work(globals.thpool, socketThread, (void*)(args)); } } /// Runs the Socket listener int network_accept_any() { vector<int>::iterator i; for(i = globals.fds.begin(); i != globals.fds.end(); i++){ int port = distance(globals.fds.begin(),i); arg_struct_listenPort *args = new arg_struct_listenPort; args->arg_fd = *i; args->arg_port = globals.cmnSystemCatalogs[port].diag_port; thpool_add_work(globals.thpool, receiveFromSocket, (void*)(args)); } cout << "Listening threads created..." << endl; return 0; }
另外,我会关注@John Bollinger和@Superlokkus的评论。
谢谢你们!