|
| Kommunikation med netkort. *** ikke netvær~ Fra : N_N |
Dato : 14-04-04 11:03 |
|
Hej Gruppe.
Er der nogen der har kendskab til om det er muligt at "snakke" med et
netkort.
Jeg ønsker at forbinde en del PC'ere via netværkskort, men har ikke behov
for at køre med netværk.
Jeg skal bruge det under DOS.
Formålet er at sende små "beskeder" ud til flere PC'ere.
Disse beskeder skal jeg så "lytte" efter med et tilsvarende program på de
andre PC'ere.
Altså, et program der kan kommunikere med et netkort, hvor det er muligt
selv at fastlægge det der sendes ud og ligeledes selv modtager disse data.
Disse PC'ere skal forbindes med gamle netkort der bruger coaxkabler
forbundet i serie.
Hvis det altså kan lade sig gøre.
Alternativt ville RS232 kunne benyttes, men det vil gøre det mere
besværligt, da hver maskine kun har 2 seriel porte.
Selvfølgelig kan hver maskine forbindes med 2 nabomaskiner. Og man kunne
selvfølgelig lave programmet således at det der sendes ud fra een maskine,
vil blive videresendt fra nabomaskinen indtil alle maskiner har modtaget
data.
Men netværksløsningen virker hardwaremæssigt smartere. Ved bare ikke om det
softwaremæssigt kan lade sig gøre!
Anyone???
N
| |
Jakob NIelsen (15-04-2004)
| Kommentar Fra : Jakob NIelsen |
Dato : 15-04-04 17:12 |
|
> Jeg ønsker at forbinde en del PC'ere via netværkskort, men har ikke behov
> for at køre med netværk.
> Jeg skal bruge det under DOS.
> Formålet er at sende små "beskeder" ud til flere PC'ere.
> Disse beskeder skal jeg så "lytte" efter med et tilsvarende program på de
> andre PC'ere.
> Altså, et program der kan kommunikere med et netkort, hvor det er muligt
> selv at fastlægge det der sendes ud og ligeledes selv modtager disse data.
Ja, det kan du sagtens. Du skal finde specifikationerne for et ne2k
kompatibelt kort (hvis dine kort da er det?).
Jeg har selv lavet noget i den stil. Det var dog et isa ne2k kort der blev
lodet direkte sammen med en lille cpu. Samme pointe though. Du skriver til
io-adresser fra dit dos-program. Forskellige adresser i kortet er til
forskellige funktioner. Du skriver først til en for at initialisere det.
Andre for at fylde data i dets buffer og andre igen for at sende pakken
afsted. Kortet laver ikke noget selv, så du skal lave den helt rå pakke
selv. I dit tilfælde er det bare eksempelvis en ethernet-pakke du skal skrue
sammen og sende afsted. Der skal du angive modtagerens mac-adresse, og
viola. Hvis du vil implementere icmp, ip og tcp på ip, så bliver det
væsentligt mere langhåret, men kan sagtens gøres. Min controller med 32 byte
ram (nej, glemte ikke et k eller M) endte med at kunne fungere som en
_simpel_ http server.
Det bedste info får du fra projekter hvor folk laver dette til embeddede
projekter. Eksempelvis
http://dave.47jane.com/ee281/dclausen_ee281_writeup.pdf
Hvis det ikke hjælper, så har jeg vist stadig mig testsoftware til dos
liggende. Skriv her igen hvis du vil se det.
| |
Jakob NIelsen (15-04-2004)
| Kommentar Fra : Jakob NIelsen |
Dato : 15-04-04 17:16 |
|
Fandt lige noget af det gamle frem. Meget simpelt dos-program i c og lidt
asm, som resetter kortet og læser dets mac.
Det burde kunne sætte dig i gang.
#include <stdio.h>
//------------------the difrent registers
const unsigned int NE2K_CR = 0x00;
const unsigned int NE2K_DCR = 0x0E;
const unsigned int NE2K_ISR = 7;
const unsigned int NE2K_RSAR0 = 8;
const unsigned int NE2K_RSAR1 = 9;
const unsigned int NE2K_RBCR0 = 10;
const unsigned int NE2K_RBCR1 = 11;
const unsigned int NE2K_RCR = 12;
const unsigned int NE2K_TCR = 13;
const unsigned int NE2K_IMR = 15;
const unsigned int NE2K_DATAPORT=0x10;
//------------command register commands
const unsigned char NE2K_CR_STOP = 0x01;
const unsigned char NE2K_CR_START = 0x02;
const unsigned char NE2K_CR_NODMA = 0x20;
const unsigned char NE2K_CR_PAGE0 = 0x00;
const unsigned char NE2K_CR_DMAREAD = 0x08;
//------------data control register commands
const unsigned char NE2K_DCR_BYTEDMA = 0x00;
const unsigned char NE2K_DCR_FIFO8 = 0x40;
const unsigned char NE2K_DCR_NOLPBK = 0x08;
//---------------
const unsigned char NE2K_RCR_MONITOR = 0x20;
const unsigned char NE2K_TCR_INTLBPK = 0x02;
//----------global variables
const unsigned int BASE=0x300;
unsigned int Address;
unsigned char Command;
//-------------function prototypes
void Output(unsigned int Address, unsigned char Command);
void Input(unsigned int Address, unsigned char *Data);
//----------program entry
int main()
{
unsigned char MAC[6]={0,0,0,0,0,0};
//stop card, command register
Output(BASE+NE2K_CR,NE2K_CR_STOP | NE2K_CR_NODMA | NE2K_CR_PAGE0);
//select byte transfer
Output(BASE+NE2K_DCR,NE2K_DCR_BYTEDMA | NE2K_DCR_FIFO8 | NE2K_DCR_NOLPBK);
//read mac
Output(BASE+NE2K_RBCR0,0);
Output(BASE+NE2K_RBCR1,0);
Output(BASE+NE2K_IMR,0);
Output(BASE+NE2K_ISR,0xFF);
Output(BASE+NE2K_RCR,NE2K_RCR_MONITOR); //receive off
Output(BASE+NE2K_TCR,NE2K_TCR_INTLBPK); //transmit off
Output(BASE+NE2K_RBCR0, 32); //want to read 32 bytes
Output(BASE+NE2K_RBCR1, 0);
Output(BASE+NE2K_RSAR0, 0); //low byte of start adr
Output(BASE+NE2K_RSAR1, 0); //high byte of start adr
Output(BASE+NE2K_CR, NE2K_CR_PAGE0 | NE2K_CR_START | NE2K_CR_DMAREAD);
//now do the real reading
Input(BASE+NE2K_DATAPORT,&MAC[0]);
Input(BASE+NE2K_DATAPORT,&MAC[0]);
Input(BASE+NE2K_DATAPORT,&MAC[1]);
Input(BASE+NE2K_DATAPORT,&MAC[1]);
Input(BASE+NE2K_DATAPORT,&MAC[2]);
Input(BASE+NE2K_DATAPORT,&MAC[2]);
Input(BASE+NE2K_DATAPORT,&MAC[3]);
Input(BASE+NE2K_DATAPORT,&MAC[3]);
Input(BASE+NE2K_DATAPORT,&MAC[4]);
Input(BASE+NE2K_DATAPORT,&MAC[4]);
Input(BASE+NE2K_DATAPORT,&MAC[5]);
Input(BASE+NE2K_DATAPORT,&MAC[5]);
//drop the read again
Output(BASE+NE2K_CR, NE2K_CR_PAGE0 | NE2K_CR_START | NE2K_CR_NODMA);
printf("MAC=%0x:%0x:%0x:%0x:%0x:%0x\n",MAC[0],MAC[1],MAC[2],MAC[3],MAC[4],MA
C[5]);
return 0;
}
void Output(unsigned int Address, unsigned char Command)
{
asm mov dx,Address;
asm mov al,Command;
asm out dx,al;
}
void Input(unsigned int Address, unsigned char *Data)
{
unsigned char Tmp=0;
asm mov dx,Address;
asm in al,dx;
asm mov Tmp,al
*Data=Tmp;
}
| |
N_N (15-04-2004)
| Kommentar Fra : N_N |
Dato : 15-04-04 23:42 |
|
> Fandt lige noget af det gamle frem. Meget simpelt dos-program i c og lidt
> asm, som resetter kortet og læser dets mac.
> Det burde kunne sætte dig i gang.
Tak indtil videre. Der er helt sikkert noget imellem der kan bruges. Men der
vil givet vis også være mange nye spørgsmål.
Men et eksempel siger mange gange mere end ord, så jeg siger dig mange tak.
Og mht ip, tcp på ip mm. så får jeg ikke brug for dette. Mit største problem
lige idag er at de maskiner jeg skal bruge, ikke er opstillet hjemme hos mig
selv, men i en forening. Så jeg er afhængig af at være dér, for at teste. Og
der kommer jeg kun én gang om ugen.
Men hvis det ellers er iorden med dig, så vil jeg skrive igen når jeg får
"problemer".
N
| |
Jakob NIelsen (16-04-2004)
| Kommentar Fra : Jakob NIelsen |
Dato : 16-04-04 07:09 |
|
> Og mht ip, tcp på ip mm. så får jeg ikke brug for dette. Mit største
problem
> lige idag er at de maskiner jeg skal bruge, ikke er opstillet hjemme hos
mig
> selv, men i en forening. Så jeg er afhængig af at være dér, for at teste.
Og
> der kommer jeg kun én gang om ugen.
Hvis du regner met at sende dine data over internettet uden at pakke det ind
i ip-pakker, så bliver du skuffet. Det skal du. Ellers kan mellemstationerne
ikke forholde sig til dine pakker. At sende rå netværkspakker som kun er
indpakket i eksempelvis ethernetpakker, det kræver at data ikke skal routes
yderligere.. at begge maskiner er på samme lokalnet.
> Men hvis det ellers er iorden med dig, så vil jeg skrive igen når jeg får
> "problemer".
Det er godt nok ikke et c-spørgsmål, så måske du skulle finde en gruppe
omkring netværk?
| |
N_N (16-04-2004)
| Kommentar Fra : N_N |
Dato : 16-04-04 09:39 |
|
> Hvis du regner met at sende dine data over internettet uden at pakke det
ind
> i ip-pakker, så bliver du skuffet. Det skal du. Ellers kan
mellemstationerne
> ikke forholde sig til dine pakker. At sende rå netværkspakker som kun er
> indpakket i eksempelvis ethernetpakker, det kræver at data ikke skal
routes
> yderligere.. at begge maskiner er på samme lokalnet.
Undskyld mig, men jeg må have formuleret mig forkert. Jeg skal kun forbinde
9 maskiner lokalt med hinanden.
Disse 9 maskiner skal udveksle nogle få data med hinanden. Jeg havde en idé
om at bruge et pakkesystem med Header, hvor der i headeren skulle stå
modtagen af dataerne.
Det betyder intet om de andre maskiner "ser" disse data, da programmet skal
laves således at kun modtageren af dataerne reagere på det.
> Det er godt nok ikke et c-spørgsmål, så måske du skulle finde en gruppe
> omkring netværk?
Jeg undskylder igen, da jeg mente problemer omkring hjælp til programmering.
Og dette er selvfølgelig i C.
Jeg kan lige kort uddybe mit projekt.
Jeg har 9 maskiner (på sigt, 2 i øjeblikket), og disse maskiner har hver
nogle IO-kort til styring af ekstern hardware.
Fortiden benytter jeg nogle "kanaler" på disse IO-kort for at lave samspil
imellem de forskellige maskiner.
Jeg har, som det er lavet idag, brugt typisk 16 kanaler på disse IO-kort,
til at sende data fra PC1 til PC9.
Dette er lavet på den måde at PC1 har 8 Output som er fortrådet til PC9
Input. Ligeledes har PC9 8 Output som er fortrådet til PC1 Input.
Men kunne jeg i C lave en "pakke" hvor jeg i Header angiver hvor jeg vil
sende data hen eks. til PC9, ud på "netværket" fra PC1, så gør det ikke
noget at PC3, PC4 osv. ser disse data, da kun data der er adresseret til
korrekte maskine skal reagere (min opgavve).
Og med et gammelt coaxial net, der jo alle er forbundet direkte med
hinanden, ville dette jo være en elegant løsning.
Jeg ville så kunne spare IO-kort kanaler, og bruge dem andet steds.
Forresten, så styrer IO-kortet en masse Relæer, Lamper mm.
Og jeg ville kunne spare en masse fortrådning i den videre opbygning af mit
IO-kort net, når de næste maskiner skal kobles på "nettet".
Håber jeg har fået belyst mit problem bedre.
N
| |
Jakob NIelsen (16-04-2004)
| Kommentar Fra : Jakob NIelsen |
Dato : 16-04-04 15:07 |
|
> Jeg undskylder igen, da jeg mente problemer omkring hjælp til
programmering.
> Og dette er selvfølgelig i C.
Tja. Generer ikke mig, men jeg ser altså ikke nogle c-spørgsmål i din post
>Men kunne jeg i C lave en "pakke" hvor jeg i Header angiver hvor jeg vil
>sende data hen eks. til PC9, ud på "netværket" fra PC1, så gør det ikke
>noget at PC3, PC4 osv. ser disse data, da kun data der er adresseret til
>korrekte maskine skal reagere (min opgavve).
Du kan sætte dine netkort til at modtage al trafik. Sæt dem i "promiscuous"
mode, og de indlæser al trafik på nettet.
Ellers send dine pakker med broardcast mac (FF FF FF FF FF FF), så modtager
alle også. Uanset mode.
Siden du alligevel kun vil sende til een specifik maskine, så vil det være
logisk at lade netkortet foretage filtreringen, og ganske enkelt have en
liste med mac-adresser i dit program, så du sender direkte til rette maskine
(rette netkort).
Det du vil gøre med netkortene er meget nemt. Du kan roligt gå i gang med at
lege. Direkte snak med netkortet kan endda testes i en dosboks under win nt.
Bare find din base address for kortet og gå i gang. Har endnu ikke
personligt mødt et kort som ikke var ne2k kompatibelt.
| |
N_N (16-04-2004)
| Kommentar Fra : N_N |
Dato : 16-04-04 23:29 |
|
> Tja. Generer ikke mig, men jeg ser altså ikke nogle c-spørgsmål i din post
>
Nej, men idéen med at spørge hér, var at få hjælp i C. Og det fik jeg.
N
| |
|
|