Socket UDP

343 views
Skip to first unread message

Marcelo Melo

unread,
Jun 1, 2011, 7:05:14 AM6/1/11
to pug...@googlegroups.com
Saudações pessoal!
Estou tendo dificuldades em implementar um socket UDP num mesmo processo. 
Estou querendo monitorar a confirmação do recebimento de uma mensagem por outro dispositivo via socket UDP, ou seja, envio uma mensagem e se o outro dispositivo recebeu, me manda uma outra mensagem de confirmação, para que eu possa iniciar uma outra transmissão. Quando divido os processos (um para enviar mensagem e outro para escutar na porta) funciona normalmente, porém quando coloco (os dois) no mesmo processo não funciona. Gostaria de saber se alguém já passou por isso e qual a solução para esse probleminha ;-)

[Errno 10048] Normalmente é permitida apenas uma utilização de cada endereço de soquete (protocolo/endereço de rede/porta)

Abaixo o script que estou utilizando

#CLIENTE

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

def_msg = "Digite uma mensagem: ";
print "\n",def_msg

# Send messages
while (1):
data = raw_input('>> ')
if not data:
break
else:
if(UDPSock.sendto(data,addr)):
print "Enviando '",data,"'..."

# Close socket
UDPSock.close()






#SERVER

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
data,addr = UDPSock.recvfrom(buf)
if not data:
print "!"
break
else:
print "\nRecebido '", data,"'"
UDPSock.sendto(data,addr)

# Close socket
UDPSock.close()




João Paulo Ribeiro

unread,
Jun 1, 2011, 7:13:23 AM6/1/11
to pug...@googlegroups.com
tive que usar um script semelhante ontem mesmo...
usei o recvfrom(qtde de bytes):

data,addr = udpsock.recvfrom(512) #nesse caso o pacote que eu esperava era de 512bytes



2011/6/1 Marcelo Melo <marcelol...@hotmail.com>

Marcelo Melo

unread,
Jun 1, 2011, 7:19:28 AM6/1/11
to pug...@googlegroups.com

Mas independente do número de bytes, preciso implementar no #CLIENTE após o envio da mensagem, ele passe a escutar a porta durante um período para ver se recebe uma confirmação ou não do #SERVER


From: lord...@gmail.com
Date: Wed, 1 Jun 2011 08:13:23 -0300
Subject: Re: [PugCE.Org] [2199] Socket UDP
To: pug...@googlegroups.com

Moacir Bispo Bezerra Filho

unread,
Jun 1, 2011, 7:26:29 AM6/1/11
to pug...@googlegroups.com
Tá querendo fazer emular um TCP usando UDP?

Rapaz, talvez seja mais simples se você usar duas portas para isso. Uma porta você trabalha o envio de dados e na outra o controle sobre os dados.
Você vai ter que abrir um socket para escuta no servidor, assim que o cliente receber o pacote pela porta 4321 (supondo) o servidor já está preparado para escultar a resposta em 4322.
Lembre-se que ao usar soquete ele fica caindo quando tem comunicação, ou seja se eu tenho um trafego muito grande, pode ser que não dê tempo a maquina levantar o socket novamente andes de um novo pacote chegar, ou seja enquanto eu escuto uma máquina estou surdo para as outras.
O Socket de esculta deve ficar em uma thread isolada do Socket de envio de dados (para que um não atrapalhe o outro) e essa thread da esculta tem que ficar em loop, para quando ela cair depois que receber o pacote, já levantar novamente.
Entre as threads você vai ter que usar algum mecanismo de "memória compartilhada" para que possa saber quando mandar outro pacote, ou reenviar o mesmo pacote que não chegou.
Se achou isso meio complicado... usa TCP que já tá pronto.

Marcelo Melo

unread,
Jun 1, 2011, 7:45:39 AM6/1/11
to pug...@googlegroups.com
Olá Moacir, já utilizei Threads TCP e funcionou legal, porém tenho que usar UDP e o tratamento de erros ficar na camada de aplicação... isso porque precisamos de uma maior velocidade, coisa que o TCP não provê... também estou amarrado a mesma porta :-(

Não queria usar a solução "gambitech" que seria um script pra escuta e outro pra envio e ambas escreveriam o status em um arquivo externo que era consultado para poder saber a hora de escutar após o envio da mensagem... :-/

Obrigado, irei quebrar mais a cabeça por aqui!!!

Abraço!


Date: Wed, 1 Jun 2011 08:26:29 -0300
Subject: Re: [PugCE.Org] [2201] Socket UDP
From: bi...@det.ufc.br
To: pug...@googlegroups.com

Rubens Pinheiro

unread,
Jun 1, 2011, 12:06:54 PM6/1/11
to pug...@googlegroups.com
A camada de trasnporte do servidor reconhece o cliente pela combinação porta/IP. Se você está usando os mesmos para aplicações(camada de aplicação) diferentes, é normal ele dar esse erro.
Cara, o tempo que você perde ao fazer o tratamento desses erros na camada de aplicação não seriam feitas bem mais rapidamente pelo TCP?

Att,
Rubens Pinheiro Gonçalves Cavalcante
Graduando em Ciências da Computação
Universidade Estadual do Ceará - UECE
Desenvolvedor na Argohost - www.argohost.net

João Paulo Ribeiro

unread,
Jun 1, 2011, 12:24:07 PM6/1/11
to pug...@googlegroups.com
marcelo,

fiz um teste aqui
me parece q ele fica esperando chegar...dá até para medir o tempo (pegando o time.time() antes e depois), agora se tem como configurar um timeout eu não sei como...
dá uma testada...
a dificuldade é pq se a aplicação que vc está testando enviar a resposta para a porta de saida do teu script python, vc não vai ter a informação de qual porta ele(python) usou e é meio complicado de configurar isso (eu não achei como)
então o recvfrom é feito já para esperar na porta que a aplicação vai te enviar, por que vai está relacionado ao socket que vc utilizou...

a aplicação aqui no meu caso é uma placa dedicada com ethernet rodando um servidor UDP e funcionou certinho...eu fiz um teste aqui debugando o hw parando antes de enviar o pacote de resposta, fiquei esperando um tempo e depois mandei continuar, o script só continuou qdo recebeu a resposta...

como o recvfrom só aceita informando o total de bytes...eu coloquei o tamanho total do datagrama UDP que estava configurado na aplicação embarcada...

2011/6/1 Marcelo Melo <marcelol...@hotmail.com>
Reply all
Reply to author
Forward
0 new messages