всем привет, подскажиет почему получаю болт если пытаюс читать из нескольки портов? т.е. прога биндит несколько портов, каждый новый порт в отдельном потоке и потом номер потока должен юзаться дальше в структурах указателей aio, но что-то не прет.
с 1 сокетом работает нормально, что-то ч этим set у меня не выходит.
struct aiocb a_read[50];
const struct aiocb *list;
#ifdef PTHREAD
void aio_handler(sigval_t sigval){
int ret = 0;
struct aiocb *req = 0;
req = (struct aiocb*)sigval.sival_ptr;
if (req != NULL){
if (aio_error(req) == 0) {
ret = aio_return( req );
if (ret == 0) {
close(req->aio_fildes);
}
((char*)(req->aio_buf))[ret] = '\0';
printf("the msg is %s\n", (char *)req->aio_buf);
}
}else{
printf ("the req is NULL\n");
}
}
#else
void aio_handler(int signal, siginfo_t *info, void*uap){
struct aiocb req;
int cbNumber = info->si_value.sival_int;
printf("AIO operation %d completed returning %d\n",cbNumber,aio_return(req[cbNumber]));
}
#endif
void aio_read_loop(int set){
int catched_len;
do {
catched_len = aio_read( &a_read[set]);
if (aio_suspend( &list, 1, NULL ) == 0 && aio_error( &a_read[set] ) == 0);
} while ((catched_len = aio_error( &a_read[set]) ) == EINPROGRESS);
aio_read_loop(set);
}
void aio_setup(int sock, int set){
memset(&a_read[set],0,sizeof(a_read[set]));
a_read[set].aio_buf = calloc(1,sizeof(MAX_TRANSPORT_LENTH+1));
a_read[set].aio_fildes = sock;
a_read[set].aio_nbytes = MAX_TRANSPORT_LENTH;
a_read[set].aio_offset = 0;
#ifdef PTHREAD
a_read[set].aio_sigevent.sigev_notify = SIGEV_THREAD;
a_read[set].aio_sigevent.sigev_notify_function = aio_handler;
a_read[set].aio_sigevent.sigev_notify_attributes = NULL;
a_read[set].aio_sigevent.sigev_value.sival_ptr = &a_read[set];
#else
struct sigaction action;
action.sa_sigaction = aio_handler;
action.sa_flags = SA_SIGINFO;
sigemptyset(&action.sa_mask);
sigaction(SIG_AIO, &action, NULL);
a_read[set].aio_sigevent.sigev_notify = SIGEV_SIGNAL;
a_read[set].aio_sigevent.sigev_signo = SIG_AIO;
a_read[set].aio_sigevent.sigev_value.sival_int = 0;
#endif
list = &a_read[set];
aio_read_loop(set);
}
void listening(int set){
//
int sfd;
// bind..
aio_setup(sfd,set)
}
int main(){
dev.set=5;
int h;
pthread_t thread[50];
for(h=1;h<dev.set;h++){
printf("J: %i %i\n",h,dev.set);
if (pthread_create(&thread[h], NULL, (void*)listening, h) != 0) {
return EXIT_FAILURE;
}
}
for(h=1;h<dev.set;h++){
printf("Y: %i\n",dev.set);
if (pthread_join(thread[h], NULL) != 0) {
return EXIT_FAILURE;
}
}
}