LINUX.ORG.RU

HELP!: sockets, udp, pthreads


0

0

Помогите плиз, есть прога, которая принимает UDP пакеты и нить.
void *t(void*) // нить
{
...
return NULL;
}

int main(int argc, char *argv[])
{
int sock, nobr;
...
pthread_create(&tid, 0, t, 0);
...
// Сокет блокирующий
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
...
bind(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in));
...
nobr = recvfrom(sock, &a, sizeof(a), 0, (struct sockaddr*)&adr, sizeof(adr));

После этого nobr == -1, errno == EINTR. Если убрать pthread_create, то все ок. В чем трабла?
Нашел только один workaround: делать неблокирующий сокет, но мне хочется блокирующий и интересно, "из принципа", разобраться, почему не работает стандартный вариант.

И еще вопросец, если sock сделать глобальной переменной, то errno = EINVAL. Почему?

Спасибо!

anonymous

Странно... у меня работает. И никаких проблем не возникает.
В связи с этим возникает несколько вопросов:
1) что делает поток (например, работает ли он в это время с файлами или выполняет др. операции ввода-вывода)
2) что ещё делает main ()





romanSA
()

Первая проблема решилась сама собой. Видно чтото было нетак с linuxthreads.. перекомпилил - теперь все ок.

Теперь интересует второй вопрос.. про глобальную переменную sock.
Если sock сделать глобальной переменной, то recvfrom возвращает -1,errno == EINVAL.

anonymous
()

1) Посмотри на значение переменной sock после вызова socket() и до/после вызова recfrom(). Совпадают?
2) Попробуй переименовать свою переменную, м.б. ты с чем-то конфликтуешь.

romanSA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.