UP

解决方案 »

  1.   

    我水平一般般,
    一个网信息包从网线进入你的网卡,
    网卡引发中断,
    调用网卡驱动,
    网卡驱动发给系统,
    系统收到了,
    看看是什么类型的包(什么AF_INET,AF_UNIX...)
    给相应的处理程序,
    如果是IP头则给IP协议相关处理部分,
    IP处理部分再看这个是TCP头或者UDP头或者是ICMP头,再传递相应的处理部分,
    TCP、UDP处理部分看看有哪个套接字的地址和端口号跟这个包相同,如果是的话,传送给相应的套接字数据结构。
    套接字是一个大的数据结构,我一般称之为一个数组序号,
    在LINUX中是INODE(文件系统)的一种(但是ACCEPT所生成的套接字结构比较简单)
    你调用函数生成了一个套接字,这个意思就是系统帮你生成了一个数据结构,
    你要是BIND的话,系统会将你的IP地址和端口号填入数据结构的一部分,然后将套接字状态(其实也是一个BYTE定义的)设定为监听状态。
    有人可能问,机器套接字很多的时候,是怎么样读取的,-->一般采用的是哈系表。
    套接字的数据结构中还会有个指针指向你的接受缓冲区,我们一般调用read就是直接读的那个缓冲区里面的东西。
    而SEND一般是直接发到硬件驱动的缓冲区了。
    WINDOWS的SOCKET没有原代码,采用的方法是分层结构,不过内部实现估计都差不多,区别应该在于协议是可以动态添加的,在LINUX里面是由一个个的函数决定的,在WINDOWS里面可以以SPI的开工提供一个文件来实现。
    比如说,我本来只支持TCPIP的,现在我只要加个文件,就可以实现IPXSPX了。请高手们指点吧,我比较罗索了一点
      

  2.   

    ..........
    ip_forward转发route
    ..........
      

  3.   

    或者像我一样看LINUX网络原代码。
      

  4.   

    你说的是TCPIP类库吧?
    http://www.codeproject.com/internet/
    到这里面找找看,很多高手在这边的。