Суть такова: многопоточное приложение, в одном потоке принимаются пакеты, в другом парсится то, что принял первый и отправляется обратно. Все это по udp. В итоге имеем «bad file descriptor» при вызове recvfrom().
int sd;
void *recv_mngr_func(void *arg)
{
uint8_t buf[sizeof(struct msg)];
struct sockaddr_in client_addr;
socklen_t client_addr_len;
...
while(1) {
...
if(recvfrom(sd, buf, sizeof(struct msg), 0, // error
(struct sockaddr *) &client_addr, &client_addr_len) < 0) {
perror("server: recvfrom");
}
...
}
}
int main(int argc, char **argv)
{
pthread_attr_t common_attr;
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(6006);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sd = socket(server_addr.sin_family, SOCK_DGRAM, 0);
if(sd < 0) {
perror("server: socket");
exit(EXIT_FAILURE);
}
if(bind(sd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
perror("server: bind");
exit(EXIT_FAILURE);
}
pthread_mutex_init(&queue_mngr_mutex, NULL);
pthread_cond_init(&queue_mngr_cond, NULL);
pthread_attr_init(&common_attr);
pthread_attr_setdetachstate(&common_attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&recv_mngr_thread, &common_attr, recv_mngr_func, NULL);
pthread_create(&queue_mngr_thread, &common_attr, queue_mngr_func, NULL);
...
}