Sida 1 av 2
Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 04:39:43
av JimmyAndersson
Jag vet, rubriken är otydlig, men jag ska förklara.
Jag behöver göra ett C#-program som körs på Windows-datorer.
Detta program behöver då och då (i genomsnitt ett par gånger per dag)
ta emot data (max 50 bytes eller alfanumeriska tecken) från en specifik IP-adress.
Resten av tiden ligger det i vila, redo för ny data.
Sedan behöver jag förstås göra ett program i andra änden också, dvs programmet som sänder denna data.
Det är detta program som är "mastern", dvs det bestämmer när data ska överföras till Windows-programmet.
(Här har jag inte bestämt mig för om det blir i Python eller C.
Det kommer köras i Linux på en "vanlig" server eller Raspberry Pi.)
Nu till frågorna:
1) Måste C#-programmet fråga "finns det data?" stup i kvarten,
eller finns det något slags interrupt för nätverk?
2) Hur skickar jag lämpligast datan med tanke på förra frågan?
Är något ur
REST (dvs GET/POST) rätt grej för detta?
Upplys mig med

Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 07:33:23
av svanted
ett sätt är att skicka data från en dator till den andra via en SOCKET och sparat dessa som en datafil i mottagardatorn, tillsammans med en tidsstämpel.
programmet som ska ha dessa kan då polla datafilen efter nya rader.
ett annat är att låta sändardatorn köra ngt program på mottagadatorn iom att data skickas typ rexec eller en ssh login och köra ngt kommande.
med data som parameter.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 07:51:30
av johano
Bygg en REST-service med WCF i C# programmet och kör det som en service eller under IIS (kan ju köra som ett vanligt program också, men då måste du vara inloggad pch ha programmet startat), posta sen in dina data till den från Raspberry programmet. Kör med en enkel JSON-datamodell så är det enkelt att felsöka med en sniffer, dessutom enkelt att snickra ihop en liten testklient som kan simulera trafiken under utvecklingen.
/johan
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 11:58:28
av Pajn
Vet mastern IP adress alternativt hostname (domän) till klienterna?
D.V.S. kan man lägga upp det så att mastern skickar data till klienterna istället
för att de hämtar från mastern?
Hur många maskiner rör det sig om?
Om det inte rör sig om för många maskiner som ska hämta data skulle jag troligtvis
skapat en TCP server som skapar en ny tråd för vare anslutning (mycket lätt i Python).
Klienterna öppnar en TCP anslutning mot mastern. När mastern har ny data att skicka
så loopar den över alla anslutningar och trycker ut data.
Om det är för många klienter så skulle jag sätta upp en HTTP REST server på mastern
där varje klient får polla efter ny data (beror förvisso på hur snabbt ny data måste
komma fram till klienterna).
Är svaret på första frågan ja och det är många klienter så skulle jag istället ha servern
på klienterna (TCP/HTTP REST eller vad du vill) och låta mastern ansluta till dessa när
data ska skickas.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 16:57:31
av JimmyAndersson
"Vet mastern IP adress alternativt hostname (domän) till klienterna?"
Jag skulle kunna ordna så att mastern vet det.
Eller tvärt om: Att klienterna känner till masterns IP
och när de "kopplar upp" mot mastern så får den klienternas IP.
Då blir det bara ett enda IP (masterns) som användaren/administratören behöver känna till.
Men jag är öppen för alla förslag.
"kan man lägga upp det så att mastern skickar data till klienterna istället
för att de hämtar från mastern?"
Det är precis så jag skulle vilja ha det. Dvs att mastern bestämmer när data ska överföras till klienterna.
Det rör sig om max 8-10st maskiner. I genomsnitt är 4st igång/aktiva samtidigt.
Mycket intressanta förslag!
Spontant så fastnade jag lite extra för 'Klienterna öppnar en TCP anslutning mot mastern.'
Det var nog ungefär så min diffusa bild av lösningen såg ut.
Förresten:
"beror förvisso på hur snabbt ny data måste komma fram till klienterna"
Jag glömde skriva det tidigare:
Det får inte dröja mer än 3 sekunder från det att mastern vill skicka, till dess att varje klient har fått datan.
1 sekund är okej. Ännu kortare tid vore förstås utmärkt, som vanligt.
Johano: Tack för tipset om WCF. Jag ska läsa på mer om det.
Svanted: Ingen dum idé. Lite synd att man behöver polla,
men om inte annat ska jag komma ihåg den lösningen till ett annat projekt.
-
Redan nu har jag en del att ta in och undersöka. Tack för alla tips!

Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 17:04:26
av johano
Kommer alla burkar befinna sig på samma (lokala) nät eller kan de finnas lite varsomhelst
ute på nätet (bakom adsl-modem, NAT-ade nät et.c.)?
/johan
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 17:10:29
av LHelge
Känns väldigt overkill med en WCF REST service. Jag hade öppnat en UDP-socket och skickat data med UDP istället.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 17:34:30
av JimmyAndersson
Johano:
De kommer bara finnas inom samma lokala nät.
(Två burkar finns visserligen bakom en bridge, men det är ju inga problem.)
LHelge:
Iofs.. Inte så dumt med tanke på att det är ganska lite data som ska skickas per gång.
Frågan är isåfall om jag klarar mig utan att ha några "sessions", för annars får man ju göra dem själv.
Kan tillägga att mastern i sig inte behöver veta att klienterna har fått datan.
Men klienterna måste veta att de fått all data. Annars blir det helknasigt.
Så någon form av kontroll måste finnas. Helst utan att jag behöver göra den i programmet.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 18:50:14
av Icecap
Det bör ju röra sig om datablock, alltså lägger man in en checksum i datablocket så att mottagaren kan kontrollera att det är OK.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 18:54:06
av sodjan
> Men klienterna måste veta att de fått all data. Annars blir det helknasigt.
Vad betyder "all" här? Samtliga paket? Eller att paketen är hela/kompletta?
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 20:01:19
av Pajn
Med TCP får du felhantering gratis så igen större ide att hitta på en egen.
Jag tänkte lite till, eftersom du inte verkar behöva skicka data från klienterna till
mastern så slipper du ju skapa en tråd för varje klient. Bara att spara undan
anslutningen du får från socket.accept() i en lista och sedan är det bara att
loopa över den liknande
Kod: Markera allt
for client in clients:
try:
client.sendall(data)
except socket.error:
clients.remove(client)
Det kan även vara bra att sända en heartbeat lite då och då för att minska risken
att anslutningen dör av oförklarlig anledning. Om en klient inte har fått en hearbeat
inom vald tid så stänger den anslutningen och försöker öppna en ny.
Re: Skicka data mellan två program via nätverket?
Postat: 3 december 2013, 23:15:38
av JimmyAndersson
Utmärkt idé! Det blir helt klart den metoden som jag ska testa först.
Sodjan:
'Vad betyder "all" här? Samtliga paket? Eller att paketen är hela/kompletta?'
Att paketen är kompletta. Dvs datan som mastern ska lämna ifrån sig är identisk med datan som når klienten.
Längden på varje datapaket kan variera (max 50st alfanumeriska tecken),
men det går förstås att "fylla ut" om det skulle underlätta med en fast längd.
Icecap:
Bra och enkel idé.

Re: Skicka data mellan två program via nätverket?
Postat: 4 december 2013, 09:35:13
av baron3d
Re: Skicka data mellan två program via nätverket?
Postat: 4 december 2013, 11:25:23
av XorXaX
Det här exemplet har jag använt mig utav mååååånga gånger och det fungerar utmärkt till det du vill.
http://tech.pro/tutorial/704/csharp-tut ... tcp-server
Man skapar en trådad server som skapar en ny tråd för varje ansluten klient. Klienterna ansluter och sen är det bara att köra på, skicka data åt vilket håll du vill.
Re: Skicka data mellan två program via nätverket?
Postat: 5 december 2013, 21:16:06
av slo
Skulle inte UDP Broadcasts vara en simpel lösning?
Eller tänker jag helt fel
http://msdn.microsoft.com/en-us/library ... .110).aspx