Vinnaren i pepparkakshustävlingen!
2011-07-15, 14:20
  #1
Medlem
Jag har gjort en UDP-server och en UDP-client enligt RFC867, även kallat Daytime Protocol. Där servern ska skicka ut tid, dag och datum till en klient som anropar servern.

Här är servern:


Och här är klienten:


Problemet med allt detta är att klienten inte ska skicka något. Den ska ansluta sig till server utan att skicka något och få svar om tid och datum tillbaka.

Någon som vet hur jag ska lösa detta? Något tips?
Jag har kollat runt en hel del på Internet men inte hittat något vettigt.
Citera
2011-07-15, 16:30
  #2
Moderator
vhes avatar
Tror svaret ligger i .listen() och .accept():

Kod:
# server.py
import socket, datetime

PORT=1300
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("",PORT))
s.listen(5)
while True:
        conn, addr = s.accept()
	time = datetime.datetime.now()
	conn.sendto(time.strftime("%H:%M %A %d-%m-%Y"),addr)
s.close()

Kod:
# client.py
import socket
HOST="localhost"
PORT=1300
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
data, addr=s.recvfrom(1024)
print "Skickat:", data
s.close()

(portnummer bytt för att slippa testa som root)

[edit]: använde http://docs.python.org/howto/sockets.html som referens för att producera svar, så du kanske vill kika där oxo :)
__________________
Senast redigerad av vhe 2011-07-15 kl. 16:38.
Citera
2011-07-15, 16:53
  #3
Medlem
Jag får tacka stort för snabbt och bra svar!

Jag vet inte om det fortfarande är UDP, snarare TCP. Men ditt svar fungerar och det är huvudsaken.

Bra källa där också för övrigt, tror jag varit inne på deras sida. Dock inte avsnittet om sockets.

Tack så mycket för svaret!
Citera
2011-07-15, 17:08
  #4
Medlem
Citat:
Ursprungligen postat av micronew
Problemet med allt detta är att klienten inte ska skicka något. Den ska ansluta sig till server utan att skicka något och få svar om tid och datum tillbaka.
Om du tror det ska du nog läsa RFCn igen. Där står det nämligen såhär när det gäller UDP:
Citat:
Ursprungligen postat av RFC867
UDP Based Daytime Service

Another daytime service service is defined as a datagram based
application on UDP. A server listens for UDP datagrams on UDP port
13. When a datagram is received, an answering datagram is sent
containing the current date and time
as a ASCII character string (the
data in the received datagram is ignored).
Faktum är att det är väldigt svårt att göra annorlunda med UDP, eftersom det help beror på utbyte av datagram.

F.ö. har jag en rekommendation, och det är att du gör mer än ett försök i klienten, med en timeout för varje försök. 3 försök kan vara lagom.
Citera
2011-07-15, 17:21
  #5
Medlem
Citat:
Ursprungligen postat av levitte
Om du tror det ska du nog läsa RFCn igen.

Faktum är att det är väldigt svårt att göra annorlunda med UDP, eftersom det help beror på utbyte av datagram.

F.ö. har jag en rekommendation, och det är att du gör mer än ett försök i klienten, med en timeout för varje försök. 3 försök kan vara lagom.

Den ursprungliga koden från mitt första inlägg fungerar, men en annan kille som kollade på det tipsade mig om att klienten inte ska behöva skicka något.

Själv så kunde jag inte komma på något annat sätt än jag gjorde i mitt första inlägg. Koden där anses alltså som korrekt enligt dig? Vill bara kolla så jag fattat det rätt.
Citera
2011-07-15, 17:37
  #6
Medlem
Citat:
Ursprungligen postat av micronew
Den ursprungliga koden från mitt första inlägg fungerar, men en annan kille som kollade på det tipsade mig om att klienten inte ska behöva skicka något.
Den personen ska nog läsa på om hur datagrambaserade protokoll fungerar.

Citat:
Ursprungligen postat av micronew
Själv så kunde jag inte komma på något annat sätt än jag gjorde i mitt första inlägg. Koden där anses alltså som korrekt enligt dig? Vill bara kolla så jag fattat det rätt.
Koden är helt korrekt enligt vad jag kan se. Jag antar att du kunnat konstatera att den fungerar?
Citera
2011-07-15, 17:43
  #7
Moderator
vhes avatar
Hohum, ser ut som om jag gick på samma nit, ja. Ber om ursäkt för mitt vilseledande svar.
Citera
2011-07-15, 17:46
  #8
Medlem
Citat:
Ursprungligen postat av levitte
Den personen ska nog läsa på om hur datagrambaserade protokoll fungerar.

Får anmärka det till honom. Kan inte gå runt och lura folk sådär. xD

Citat:
Ursprungligen postat av levitte
Koden är helt korrekt enligt vad jag kan se. Jag antar att du kunnat konstatera att den fungerar?

Ja, precis. Det är den enda koden med datagram som jag fått att fungera.

Men tack så mycket du också för hjälpen!

Citat:
Ursprungligen postat av vhe
Hohum, ser ut som om jag gick på samma nit, ja. Ber om ursäkt för mitt vilseledande svar.

Ingen fara, ingen skada skedd! Du gav dig ändå tid och gav ett svar
Citera
2011-07-15, 18:18
  #9
Medlem
Citat:
Ursprungligen postat av micronew
Jag får tacka stort för snabbt och bra svar!

Jag vet inte om det fortfarande är UDP, snarare TCP. Men ditt svar fungerar och det är huvudsaken.

Bra källa där också för övrigt, tror jag varit inne på deras sida. Dock inte avsnittet om sockets.

Tack så mycket för svaret!

När du skapar en socket och anger socket.SOCK_STREAM skapar du en TCP-socket.

För att skapa en UDP-socket använder du socket.SOCK_DGRAM.

Källa: http://wiki.python.org/moin/UdpCommunication

Edit:
Stirrade mig blind på vhes kod och missade spoilersen.
__________________
Senast redigerad av Patron_ 2011-07-15 kl. 18:22.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback