TCP hálózat programozás alapok

Sziasztok, egy szimpla demo projectben kérném a segítségeteket, tehát nem kell nívós megoldás, csak működjön. A számítógépes hálózatokból nincs értékelhető tudásom, ez lehet változni fog, de a dolog jó lenne, ha hamar elkészülne.

Lenne egy eszközöm (PLC, S7) aminek az állapotát szeretném sok helyről (PC, Python, Java) folyamatosan követni, valamint pár helyről parancsokat adni neki.

Az eszköz TCP kapcsolat kiépítését tudja (Connect, Disconnect, Send, Receive). Ami két irányú, 1-1 kapcsolatot ad. Tehát figyelésre és irányításra is jó, de csak 1 partner felé.

Hogyan illene megoldanom, az egyszerre több, azonos adatot igénylő kapcsolat kezelését? (~Multicast?)

Hülye ötletek:
Több nyitott port, mindegyiken párhuzamosan egy server?
Egy nyitott port, ciklikusan bontogatom a kapcsolatot?
Egy nyitott port, ami csak egy portszámot ad, ahol elindítok próbálkozásonként egy servert?
Valami 1-több megoldás?

Előre is köszönöm.

Hozzászólások

a leírásból csak az nem derül ki mit is szeretnél.

Simán lehet, mint említettem, semmilyen ismeretem nincs a hálózatok világából (threadingből se sokkal több). Légyszíves fejtsd ki, hogy lesz a te szavaidból, hogy a gép egyszerre sok másiknak küldjön valami kis adatot, ugyanakkor több helyről is kaphasson? A gép csak TCP, illetve ISO over TCP (RFC 1006) kapcsolatot tud.

- eloszor ezt nezd at.
- utana valaszd ki a megfelelo kornyezetet (architektura, op rendszer, prog. nyelv) amin dolgoznal, es nezz utana hogy a fenti api-t hogy implementaljak. a jo ebben hogy szinte mindenhol ez az alap (linux-tol kezdve unix-on a't me'g a windozos winsock-ig is), illetve ahol nem, akkor is igencsak nem art tisztaban lenni hogy hogy mukodik ez mert a magasabb szintu kezelesek is kizarolagosan erre epulnek (The Berkeley socket API forms the de facto standard abstraction for network sockets; eletem elso ruby programja egy hup-os kollega halozatkezelo programjanak a debuggolasa volt, ugyhogy azelotte ezt a nyelvet meg tavolrol sem lattam... tenyleg inkabb az szamit hogy a b.s. api-t mennyire ismered jol, akarmilyen nyelven is).
- talald ki hogy mi a feladat, es arra mi a jo megoldas. (( hint: multicast az teljesen mas, neked az nem kell. ))
- irj kisebb tesztprogramokat. mindegyikre (szerver, kliens), lehet irni ma'r c-ben is olyan 40-60 soros kodokat, amik mukodnek, es magasabbszintu programnyelvbekben valoszinuleg ezek meg egyszerubbek (( hint: copypaste a wikipediarol ))
- a "tcp szerver" mint olyan, az egy porton figyel, azt te nem zarod be, hanem azon hallgatozol. az egy mas kerdes, hogy a klienseket hogy kezeled le. 2 fele alap-koncepcio letezik: konkurrens aszinkron multiplexing (hint: select), illetve tobbszalu kezeles (hint: thread-ek, fork, processzek, ipc, barmi, a "sza'l" itt kepletesen ertendo). elonyok es hatranyok mindenhol vannak, utana kell nezni hogy neked mi a jobb.

Alapok, jól gondolom?
Server program elindul az egyik gépen, nyit magának egy portot, figyel.
Ha valaki csatlakozik hozzá, akkor az a port foglalt lesz? Vagy erre való a több socket-es dolog?
Egy porton keresztül több TCP kapcsolat is működhet? Ha igen, akkor vajon megcsinálható a fent említett 4 db eszközzel?

Az S7 az egy Siemens S7? Ha igen, nezz jobban utana, mert nem biztos, hogy az sima TCP kapcsolat lesz neked...
En inkabb azt javasolnam neked, hogy egy OPC serveren keresztul probald megoldani.

Sic Transit Gloria Mundi

Itt van egy S7-1200 az asztalomon, de meg nem kezdodott el a projekt amin hasznalni fogjuk, igy meg nincs tapasztalatom vele...
Ezt a ket forumtemat tudom javasolni atnezesre:
https://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?HTTPS=…
https://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?HTTPS=…

P.S. Noha hivatalosan meg nem tamogatott, de sokan irjak, hogy S7-200 PC Access tudja kezelni az S7-1200 csaladot is.

Sic Transit Gloria Mundi

1-1 eseten hogyan oldottad meg: ki a server es ki a kliens?

TCP eseteben van egy server, amelyik egy adott porton varja a csatlakozasokat es egy vagy tobb kliens, amelyek az adott porton csatlakoznak. A kliens az aki kezdemenyezni a kapcsolatot, a server csak ul, es var mig csatlakozik a kliens. Attol fuggoen, hogy hogyan van megirva a server, kepes lehet tobb kliens csatlakozasat is kezelni.
Jelen helyzetben a PLC az aki a server kellene legyen. Es o varja a kliensek csatlakozasat. A dokumentacioban azt irja, hogy elvileg 16 csatlakozast kepes kezelni. De abban nem tudok segiteni, hogy hogyan el ezeket kezelni, nem ismerem a fuggvenyek leirasat. (Gondolom kell legyen valami ConnectionID, ami alapjan kezeled a kulonbozo csatlakozasokat...)

Legroszabb ersetben megoldhatod azt, hogy ha mar 1-1 megy, akkor az egyik a PLC a masik egy PC, ami ugyancsak TCP-n keresztul adja tovabb az informaciot...

Sic Transit Gloria Mundi

1-1 nel mindket modot kiprobaltam, tehat tud server lenni a PLC, ami a gondom, hogy ha csatlakozok hozza, akkor ujabb csatlakozasi kiserletet visszadobja. amit meg ki akarok probalni ma, hogy ha letrejon egy kapcsolat, akkor inicializaljon egy uj listen-t ugyanazon a porton, hatha sikerul.
Nem szeretek kozbulso pc-t, bar ketsegtelen, egyszerubb lenne.

Ha ugyanazon a porton nem sikerul tobb listent inicializalni, megprobalhatod esetleg mas porton. Ha ugy sikerul, akkor megcsinalhatod azt, hogy inicializalsz mondjuk 4 listent 100,200,300,400-as portokon. Ez esetben 4 kulonbozo helyrol csatlakozhatsz hozza, es mindegyiknek meglesz a port, hogy melyiken csatlakozhat.

Sic Transit Gloria Mundi