• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

magician

Socket UDP em C

13 mensagens neste tópico

Boas estou a fazer um trabalho em C em que tenho de implementar um cliente e preciso que ao fazer recvfrom seja definido timeout para o cliente não precisar de esperar indefinidamente pela resposta do servidor e ao invés disso realizar outro pedido.

Encontrei alguns exemplo em que é usado o alarm, mas com o alarm o programa termina :S

Como posso resolver isto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a dúvida é trabalhar com o alarm posso-te deixar aqui um exemplo de um pequeno programa que eu fiz numa aula de Sistema Operativos. O objectivo era a cada 10 segundos avisar o utilizador que estava a demorar muito a escrever alguma coisa...

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>

void trata()
{
puts("Esta a demorar muito tempo a introduzir os dados!!!");
alarm(10);	
}

main()
{
char dados[100];

alarm(10);

for(;{
	signal(SIGALRM, trata);
	fgets(dados, 100, stdin);
	alarm(10);
}
}

PS: Também usei sinais.

Mas também acho que podias fazer o que pretendes com o sleep();)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com deixa la ver se percebi o funcionamento disso:D

Ele entra em um ciclo de pedidos em que cada vez que o alarm dispara ele executa a função trata correcto ?

não é possível mandar uma variável como argumento do trata ? É que preciso de incrementar uma variável que está no main.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes sempre declara a variável globalmente e incrementá-la. Mas depende de como tenhas isso... O código que te dei como exemplo foi só para teres uma ideia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tão mas entendi o funcionamento correcto ?

Acho que percebeste bem o funcionamento.

Se quiseres saber mais pormenores sobre o funcionamento interno do alarm e dos sinais existe muita documentação na net, se bem que no teu caso não deve ser muito importante. :cheesygrin: Boa sorte com o trabalho!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olha lá como posso fazer para quando ele vai ao trata para parar de esperar e fazer outra coisa?

Aplicando o teu exemplo seria algo assim.

void trata(){
puts("Esta a demorar muito tempo a introduzir os dados!!!");
alarm(10);
}

main(){
char dados[100];

alarm(10);

for(;{
	signal(SIGALRM, trata);
	fgets(dados, 100, stdin);
                printf("OI");
	alarm(10);
}
}

Como faço para quando ele disparar no tratar parar o fgets e fazer o printf?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmmm... Não percebi lá muito bem, mas podes sempre criar outra função e ao enviar o signal em vez de meter signal(SIGALRM, trata); metes signal(SIGALRM, funcao);, onde funcao é o nome da função. Lá dentro podes meter o printf.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não mas eu quero mesmo que ele salte :cheesygrin:

Tipo isso é para ser aplicado no recvfrom e quero que ele pare o recv e passe em frente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que tens de usar threads. Metes uma thread a fazer o recvfrom e o alarm na thread principal. Se o alarm disparar antes de a thread do recvfrom ter terminado, mata-la (não sei se em C se podem simplesmente matar threads, mas suponho que sim).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo não pode ser com threads :S Porque não posso meter o o recvfrom sozinho numa thread.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo não pode ser com threads :S Porque não posso meter o o recvfrom sozinho numa thread.

Mas podes usar forks. Não sei se já deste mas isso ia-te permitir criar um processo e correr o rcvfrom no processo filho e continuar o programa no processo original.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resolvi o problema com um select ;) e um while com continue  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora