Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: потоки и сокеты...  (Прочитано 10027 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Loki
Участник

ru
Offline Offline

« : 26-09-2009 16:10 » 

всем привет, подскажиет почему получаю болт если пытаюс читать из нескольки портов? т.е. прога биндит несколько портов, каждый новый порт в отдельном потоке и потом номер потока должен юзаться дальше в структурах указателей 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;
    }
}
}
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 26-09-2009 17:08 » 

Loki, А где у тебя сами сокеты? Нашел только отдаленное упоминание
Код:
void listening(int set){
//
int sfd;
// bind..

aio_setup(sfd,set)
}
И что то мне подсказывает, что aio_setup выполняется в последнюю очередь, после начала прослушивания сокета?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Loki
Участник

ru
Offline Offline

« Ответ #2 : 27-09-2009 03:26 » 

Цитата
А где у тебя сами сокеты? Нашел только отдаленное упоминание
а там все нормально=) поэтому и не стал постить
Цитата
И что то мне подсказывает, что aio_setup выполняется в последнюю очередь, после начала прослушивания сокета?
конечно.
т.е. если я запускаю без тредов, то работает, просто 1 сокет в асинхроне читается, т.е. set туда нормально передается, а вот в отдельном треде я передаю уже номер как аргумент в начале в потоковую функцию. а потом дальше...
собственно у меня трабл с использование aio в отдельном потоке, пробовал убрать массив указателей.. a_read[set] и сделать прсто a_read, в принципе так правильнее, т.к. теперь код граничит на уровне потока(т.е. юзать aio_setup(sfd) ).
но при получении данный я получаю гиганские очереди на сокете... Быть такого не может
Код:
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:7103            0.0.0.0:*               LISTEN
tcp       48      0 192.168.10.10:7103      192.168.10.10:40067     CLOSE_WAIT
tcp        0      0 192.168.10.10:40067     192.168.10.10:7103      FIN_WAIT2
tcp       28      0 192.168.10.10:7103      192.168.10.10:40069     ESTABLISHED
tcp        0      0 192.168.10.10:40069     192.168.10.10:7103      ESTABLISHED
udp      284      0 0.0.0.0:7101            0.0.0.0:*
udp        0      0 0.0.0.0:7104            0.0.0.0:*
« Последнее редактирование: 27-09-2009 03:33 от Loki » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 27-09-2009 10:14 » new

Loki, В любом случае, покажи сокетную часть.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines