Skicka data mellan två program via nätverket?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Skicka data mellan två program via nätverket?

Inlägg 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 :idea:
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Skicka data mellan två program via nätverket?

Inlägg 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
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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! :tumupp:
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Skicka data mellan två program via nätverket?

Inlägg 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
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Skicka data mellan två program via nätverket?

Inlägg 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?
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26578
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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é. :)
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1353
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Skicka data mellan två program via nätverket?

Inlägg av baron3d »

XorXaX
Inlägg: 409
Blev medlem: 27 maj 2004, 09:44:16

Re: Skicka data mellan två program via nätverket?

Inlägg 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.
slo
Inlägg: 103
Blev medlem: 7 januari 2009, 10:57:35
Ort: Åbo, Finland
Kontakt:

Re: Skicka data mellan två program via nätverket?

Inlägg 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
Skriv svar