简单描述一下我的项目。我自己封装了 winsock api 成 类CSynchronizationSocket。
适用于server,client。根据我的需要,自己加了很多属性,我有很多的终端,假定是100台。server在accept(accept在专门的线程里)后,判断他的ip或者是网卡地址(我不清楚这个),然后给他编号。各个终端有不同的需求,每个终端对应一个线程,处理相关请求。我想把对应于每个线程的各种需求包在一个结构中,每个终端一个编号,
但编号通过什么来不清楚?是通过ip呢还是网卡呢?
哪个是不变的,在局域网里?谢谢你的回答
适用于server,client。根据我的需要,自己加了很多属性,我有很多的终端,假定是100台。server在accept(accept在专门的线程里)后,判断他的ip或者是网卡地址(我不清楚这个),然后给他编号。各个终端有不同的需求,每个终端对应一个线程,处理相关请求。我想把对应于每个线程的各种需求包在一个结构中,每个终端一个编号,
但编号通过什么来不清楚?是通过ip呢还是网卡呢?
哪个是不变的,在局域网里?谢谢你的回答
好象要应用于win98的,有没有碍?
网卡地址是固化在网卡内的芯片上的,是全世界唯一的.
union u {uint word; struct{uchar high;uchar low;}bytes;}; //我定义的数据结构,为两个字节的结构 //,可以按照uint(unsigned int)来读取,也可以按照高低字节high和low来读取。 union u mynodeid[3];//存储网卡的物理地址
union u protocal; //临时变量
void readmynodeid()
{uchar data i,temp;
page(0);
reg09=0;//寄存器RSAR1 dma read highaddress=0
reg08=0;//RSAR0 dma read lowaddress=0;
reg0b=0; //RBCR1 read count high
reg0a=12;//RBCR0 count low
reg00=0x0a;//dma read and start
for (i=0;i<6;i++)
{ temp=reg10;//读取一个字节
if (i % 2==0)
{protocal.bytes.high=temp;}
else {protocal.bytes.low=temp;mynodeid[i/2].word=protocal.word;}temp=reg10;//读取一个重复的字节,这个字节被丢弃}
}--网卡除了16k(地址0x4000-0x7FFFF)的接收发送存储RAM之外,还有别的RAM,还有一块大小为256字节的RAM,地址为0x0000-0x00FF,这部分RAM是eeprom 93C46的影像存储(不完全一样),存储的内容的一部分跟93C46存储的是一样的。 网卡在上电的时候将93C46的一部分内容读到这256字节的RAM里。
存储是WORD类型,其中地址:
0x0000-0x000b共12个字节是网卡的物理地址。(网卡的物理地址是6个字节的,为什么要用12字节?因为这12字节是重复存储的。例如网卡物理地址0x52544CC118CF,存储在0x0000-0x000b里是这样的:525254544C4CC1C11818CFCF
我们可以看到单和双的地址存储的是一样的。0x000b后面的地址存储的是生产厂商的代码和产品标识代码,也是单双地址重复存储,这里就不说了。 这个程序又用到4个新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0
这4个寄存器是专门用于读取网卡上面的ram的。
RSAR1 网卡上的RAM的起始地址高8位
RSAR0 网卡上的RAM的起始地址低8位
--程序中的reg09,reg08都设成0,所以是从网卡上的0x0000地址开始读。
RBCR1 要读取的字节数的计数(高8位)
RBCR0 要读取的字节数的计数(低8位)
--程序中的reg0b=0,reg0a=12,所以要读取12个字节。
reg00=0x0a 的意思是进行DMA的内存读取操作。--结果将网卡地址存储在mynodeid[3](共6个字节)里。
}
i c ! 难道你是想从win98登陆win2000的终端服务?服务器是win98,终端还要自己做的那种。
现在测试是win2k,先不管win98。
而IP地址是网络分配给他的,如果网络有什么变动的话,IP地址就很可能改变。在局域网中,网络设备之间通讯,虽然都用IP地址标识,但它们在底层会用ARP(地址解析协议)解析出具体目标的物理地址,也就是说:它们最终是通过Mac地址来通讯的。