??xml version="1.0" encoding="utf-8" standalone="yes"?>国产一区二区三区免费视频,奇米影视888狠狠狠777不卡,国产精品v片在线观看不卡http://www.aygfsteel.com/huyi2006/articles/192016.html胡意胡意Thu, 10 Apr 2008 15:01:00 GMThttp://www.aygfsteel.com/huyi2006/articles/192016.htmlhttp://www.aygfsteel.com/huyi2006/comments/192016.htmlhttp://www.aygfsteel.com/huyi2006/articles/192016.html#Feedback0http://www.aygfsteel.com/huyi2006/comments/commentRss/192016.htmlhttp://www.aygfsteel.com/huyi2006/services/trackbacks/192016.html 重装TCP数据D,我看了《TCP/IP详解卷二Q实现》觉得它里面的实现考虑的很全面Q当然也很复杂。而我l装只是Z监视,所以不必那么复杂,于是自己想了一个方法。现在我已经Ҏq个Ҏ成功l装TCP分段Q所以这个方法是可行的。另外,我的IP分片的组装用的方法跟q个Ҏ也差不多?/p>

    首先说下存储tcp分段的数据结构:一个二l链表,我把它叫作重装表。具有相同socket对(源ip地址、目的ip地址、源端口受目的端口号Q的tcp数据包放在一个横向的链表里,该链表的头节点只保存了源ip地址、目的ip地址、源端口受目的端口号q些信息。如下图所C:

 

    然后介绍重装TCP数据D늚ҎQ?/p>

1.每到来一个tcp数据?pkt)Q我先将该数据包的源ip地址、目的ip地址、源端口受目的端口号取出来在重装表(tpq_tblQ中U向的链表中查找有没有与它相匚w的链?fp)存在Q如果有Q就把pkt数据包放入与它有相同socket对的fp链中Q放入链表的Ӟ我先查找pkt的顺序号在链表中的适当位置Q然后才攑օQ如果没有,则在tpq_tbl中新创徏一个该cd的链表头节点Q然后再其攑օ新创建的链表中?/p>

2.每当在fp中放入一个tcp数据D后Q我检查fp链表中的数据D|否已l到齐了Q判断方法下面介l)Q若到齐Q就个链表中所有数据段的数据部分拼接到一P得到应用层报文,然后释放该链表,然后重复1Q?步骤Q若没到齐,直接重复1Q?步骤?/p>

 关于判断一个链表中tcp数据D|否到齐的ҎQ?br />    使用的变量说明:
    count计数器,表示当前链表中的所有tcp数据D|据部分的长度之和。每当在该链表中加入一个新tcp数据D|Q我都会count累加上该tcp数据D늚数据部分的长度?br />    syn_seqQ表C本ơtcpq接的第一个数据包的顺序号Q也是建立tcpq接时的W一ơ握手的SYN包的序受?br />    fin_seqQ表C本ơtcpq接的最后一个数据包的顺序号Q也是关闭tcpq接时的W二个FIN包的序受?/p>

    判断Q当(fin_seq - syn_seq)与count相等Ӟp明tcp数据D已l到齐,否则是没有到齐?br />



胡意 2008-04-10 23:01 发表评论
]]>
Linux|络~程-- 服务器模?/title><link>http://www.aygfsteel.com/huyi2006/articles/189520.html</link><dc:creator>胡意</dc:creator><author>胡意</author><pubDate>Sat, 29 Mar 2008 12:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/huyi2006/articles/189520.html</guid><wfw:comment>http://www.aygfsteel.com/huyi2006/comments/189520.html</wfw:comment><comments>http://www.aygfsteel.com/huyi2006/articles/189520.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/huyi2006/comments/commentRss/189520.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/huyi2006/services/trackbacks/189520.html</trackback:ping><description><![CDATA[ 在网l程序里?一般的来说都是许多客户机对应一个服务器.Z处理客户机的h, Ҏ务端的程序就提出了特D的要求.我们学习一下目前最常用的服务器模型.<br /><br />循环服务?循环服务器在同一个时d可以响应一个客L的请?br /><br />q发服务?q发服务器在同一个时d以响应多个客L的请?br /><br /><br />9.1 循环服务?<br /><br />UDP服务?br />UDP循环服务器的实现非常?<br />UDP服务器每ơ从套接字上d一个客L的请?处理, 然后结果返回给客户?<br /><br />可以用下面的法来实?<br /><br />    socket(...);<br />    bind(...);<br />    while(1)<br />    {<br />        recvfrom(...);<br />        process(...);<br />        sendto(...);<br />    }<br /><br />因ؓUDP是非面向q接?没有一个客L可以老是占住服务? 只要处理q程不是d@? 服务器对于每一个客h的请求L能够满.<br /><br />9.2 循环服务?<br /><br />TCP服务?br />TCP循环服务器的实现也不?TCP服务器接受一个客L的连?然后处理,完成了这个客L所有请求后,断开q接.<br /><br />法如下:<br /><br />socket(...);<br />bind(...);<br />listen(...);<br /><br />while(1)<br />{<br />    accept(...);<br />    while(1)<br />    {<br />        read(...);<br />        process(...);<br />        write(...);<br />    }<br />    close(...);<br />}<br /><br />TCP循环服务器一ơ只能处理一个客L的请?只有在这个客L所有请求都满? 服务器才可以l箋后面的请?q样如果有一个客L占住服务器不放时,其它的客h都不能工作了.因此,TCP服务器一般很用循环服务器模型的.<br /><br />9.3 q发服务?     TCP服务?br />Z弥补循环TCP服务器的~陷,Z又想Zq发服务器的模型. q发服务器的思想是每一个客h的请求ƈ不由服务器直接处?而是服务器创Z?子进E来处理.<br /><br />法如下:<br /><br />    socket(...);<br />    bind(...);<br />    listen(...);<br />    while(1)<br />    {<br />        accept(...);<br />        if(fork(..)==0)<br />        {<br />                while(1)<br />                {<br />                    read(...);<br />                    process(...);<br />                    write(...);<br />                }<br />                close(...);<br />                exit(...);<br />        }<br />    close(...);<br />    }<br /><br />TCPq发服务器可以解决TCP循环服务器客h独占服务器的情况. 不过也同时带来了一个不的问题.<br />Z响应客户机的h,服务器要创徏子进E来处理. 而创建子q程是一U非常消耗资源的操作.<br /><br />9.4 q发服务?<br /><br />多\复用I/O<br />Z解决创徏子进E带来的pȝ资源消?Z又想Z多\复用I/O模型.<br /><br />首先介绍一个函数select<br /><br />int select(int nfds,<br />        fd_set *readfds,fd_set *writefds,<br />      fd_set *except fds,<br />      struct timeval *timeout<br />      )<br /><br />void FD_SET(int fd,fd_set *fdset)<br /><br />void FD_CLR(int fd,fd_set *fdset)<br /><br />void FD_ZERO(fd_set *fdset)<br /><br />int FD_ISSET(int fd,fd_set *fdset)<br /><br />一般的来说当我们在向文件读写时,q程有可能在d出阻?直到一定的条g满.<br /><br /> 比如我们从一个套接字L据时,可能~冲区里面没有数据可?通信的对方还没有发送数据过?,<br /> q个时候我们的读调用就会等?d)直到有数据可?如果我们?希望d,<br /> 我们的一个选择是用selectpȝ调用. <br /> <br /> 只要我们讄好select的各个参?那么当文件可以读写的时候select?通知"我们 说可以读写了. <br /> readfds所有要ȝ文g  文g描述W的集合<br />writefds所有要写的文g   文g描述W的集合<br /><br />exceptfds其他的服要向我们通知的文件描q符<br /><br />timeout时讄.<br /><br />nfds所有我们监控的文g描述W中最大的那一个加1<br /><br />在我们调用select时进E会一直阻塞直C下的一U情况发? <br />1)有文件可以读.<br />2)有文件可以写.<br />3)时所讄的时间到.<br /><br />Z讄文g描述W我们要使用几个? FD_SETfd加入到fdset<br /><br />FD_CLRfd从fdset里面清除<br /><br />FD_ZERO从fdset中清除所有的文g描述W?br /><br />FD_ISSET判断fd是否在fdset集合?br /><br />使用select的一个例?br /><br />int use_select(int *readfd,int n)<br />{<br />        fd_set my_readfd;<br />        int maxfd;<br />        int i;<br />        <br />        maxfd=readfd[0];<br />        <br />        for(i=1;i<n;i++)<br />        {<br />            if(readfd[i]>maxfd) maxfd=readfd[i];<br />        }<br />        <br />        <br />        <br />        while(1)<br />        {<br />            /* 所有的文g描述W加?*/<br />            FD_ZERO(&my_readfd);<br />            <br />            for(i=0;i<n;i++)<br />            FD_SET(readfd[i],*my_readfd);<br />            <br />            /* q程d */<br />            select(maxfd+1,& my_readfd,NULL,NULL,NULL);<br />            <br />            /* 有东西可以读?*/<br />            for(i=0;i<n;i++)<br />            {<br />                if(FD_ISSET(readfd[i],&my_readfd))<br />                {<br />                        /* 原来是我可以M */<br />                        we_read(readfd[i]);<br />                }<br />            }<br />        }<br />}<br /><br />使用select后我们的服务器程序就变成?<br /><br /><br />初始?socket,bind,listen);<br /><br />while(1)<br />{<br />        讄监听d文g描述W?FD_*);<br />        <br />        调用select;<br />        <br />        如果是們֐套接字就l?说明一个新的连接请求徏?br />        {<br />            建立q接(accept);<br />            加入到监听文件描q符中去;<br />        }<br />        否则说明是一个已l连接过的描q符<br />        {<br />            q行操作(read或者write);<br />        }<br /><br />}<br /><br />多\复用I/O可以解决资源限制的问?着模型实际上是UDP循环模型用在了TCP上面. q也带来了一些问?如由于服务器依次处理客户的请?所以可能会D有的客户 会等待很?<br /><br /> q发服务?        UDP服务?br />Z把ƈ发的概念用于UDP得Cq发UDP服务器模? <br /> q发UDP服务器模型其实是单的.和ƈ发的TCP服务器模型一h<br /> 创徏一个子q程来处理的 法和ƈ发的TCP模型一?<br /><br />除非服务器在处理客户端的h所用的旉比较长以?Z实际上很用q种模型. <br /><img src ="http://www.aygfsteel.com/huyi2006/aggbug/189520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/huyi2006/" target="_blank">胡意</a> 2008-03-29 20:14 <a href="http://www.aygfsteel.com/huyi2006/articles/189520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(C)libpcap函数库说?/title><link>http://www.aygfsteel.com/huyi2006/articles/139179.html</link><dc:creator>胡意</dc:creator><author>胡意</author><pubDate>Fri, 24 Aug 2007 13:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/huyi2006/articles/139179.html</guid><wfw:comment>http://www.aygfsteel.com/huyi2006/comments/139179.html</wfw:comment><comments>http://www.aygfsteel.com/huyi2006/articles/139179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/huyi2006/comments/commentRss/139179.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/huyi2006/services/trackbacks/139179.html</trackback:ping><description><![CDATA[ <p>(C)libpcap函数库说?/p> <p>libpcap获取数据包函数库说明</p> <p>libpcap的英文意思是 Packet Capture libraryQ即数据包捕获函数库。该库提供的C函数接口可用?/p> <p>需要捕Lq网l接口(只要l过该接口,目标地址不一定ؓ本机Q数据包的系l开发上。由 </p> <p>Berkeley大学Lawrence Berkeley National  Laboratory研究院的Van Jacobson、Craig Leres?/p> <p>Steven McCanne~写Q目前的最新版本ؓ0.4。该函数库支持Linux、Solaris?BSDpȝq_?</p> <p>主要接口函数说明如下Q?br /> <br />pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) <br />获得用于捕获|络数据包的数据包捕hq字。device参数为指定打开的网l设备名。snaplen参数?/p> <p>义捕h据的最大字节数。promisc指定是否网l接口置于؜杂模式。to_ms参数指定时旉Q毫</p> <p>U)。ebuf参数则仅在pcap_open_live()函数出错q回NULL时用于传递错误消息?</p> <p>pcap_t *pcap_open_offline(char *fname, char *ebuf) <br />打开以前保存捕获数据包的文gQ用于读取。fname参数指定打开的文件名。该文g中的数据格式?/p> <p>tcpdump和tcpslice兼容?-"为标准输入。ebuf参数则仅在pcap_open_offline()函数出错q回NULL?/p> <p>用于传递错误消息?</p> <p>pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname)<br />打开用于保存捕获数据包的文gQ用于写入。fname参数?-"时表C标准输出。出错时q回NULL。p?/p> <p>Cؓ调用pcap_open_offline()或pcap_open_live()函数后返回的pcapl构指针。fname参数指定打开</p> <p>的文件名。如果返回NULLQ则可调用pcap_geterr()函数获取错误消息?</p> <p>char *pcap_lookupdev(char *errbuf) <br />用于q回可被pcap_open_live()或pcap_lookupnet()函数调用的网l设备名指针。如果函数出错,?/p> <p>q回NULLQ同时errbuf中存攄关的错误消息?</p> <p>int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf) <br />获得指定|络讑֤的网l号和掩码。netp参数和maskp参数都是bpf_u_int32指针。如果函数出错,?/p> <p>q回-1Q同时errbuf中存攄关的错误消息?</p> <p>int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user) <br /> 捕获q处理数据包。cnt参数指定函数q回前所处理数据包的最大倹{cnt=-1表示在一个缓冲区中处</p> <p>理所有的数据包。cnt=0表示处理所有数据包Q直C生以下错误之一Q读取到EOFQ超时读取?/p> <p>callback 参数指定一个带有三个参数的回调函数Q这三个参数为:一个从pcap_dispatch()函数传?/p> <p>q来的u_char指针Q一个pcap_pkthdrl构libpcap函数库说明。bsp;  的指针,和一个数据包大小?/p> <p>u_char指针。如果成功则q回d到的字节数。读取到EOF时则q回零倹{出错时则返?1Q此时可?/p> <p>用pcap_perror()或pcap_geterr()函数获取错误消息?</p> <p>int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) <br />功能基本与pcap_dispatch()函数相同Q只不过此函数在cnt个数据包被处理或出现错误时才q回Q但</p> <p>d时不会q回。而如果ؓpcap_open_live()函数指定了一个非零值的时讄Q然后调?/p> <p>pcap_dispatch()函数Q则当超时发生时pcap_dispatch()函数会返回。cnt参数值时pcap_loop()</p> <p>函数始l@环运行,除非出现错误?</p> <p>void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp) <br />向调用pcap_dump_open()函数打开的文件输Z个数据包。该函数可作为pcap_dispatch()函数的回?/p> <p>函数?</p> <p>int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 </p> <p>netmask) <br />str参数指定的字W串~译到过滤程序中。fp是一个bpf_programl构的指针,在pcap_compile()?/p> <p>C被赋倹{optimize参数控制l果代码的优化。netmask参数指定本地|络的网l掩码?<br />         <br />int pcap_setfilter(pcap_t *p, struct bpf_program *fp) <br />指定一个过滤程序。fp参数是bpf_programl构指针Q通常取自pcap_compile()函数调用。出错时q回</p> <p>-1Q成功时q回0?</p> <p>u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h) <br />q回指向下一个数据包的u_char指针?</p> <p>int pcap_datalink(pcap_t *p) <br />q回数据链\层类型,例如DLT_EN10MB?</p> <p>int pcap_snapshot(pcap_t *p) <br />q回pcap_open_live被调用后的snapshot参数倹{?</p> <p>int pcap_is_swapped(pcap_t *p) <br />q回当前pȝL字节与被打开文g的字节顺序是否不同?</p> <p>int pcap_major_version(pcap_t *p) <br />q回写入被打开文g所使用的pcap函数的主版本受?</p> <p>int pcap_minor_version(pcap_t *p) <br />q回写入被打开文g所使用的pcap函数的辅版本受?</p> <p>int pcap_stats(pcap_t *p, struct pcap_stat *ps) <br />向pcap_statl构赋倹{成功时q回0。这些数值包括了从开始捕h据以来至今共捕获到的数据包统</p> <p>计。如果出错或不支持数据包l计Q则q回-1Q且可调用pcap_perror()或?pcap_geterr()函数来获</p> <p>取错误消息?</p> <p>FILE *pcap_file(pcap_t *p) <br />q回被打开文g的文件名?</p> <p>int pcap_fileno(pcap_t *p) <br />q回被打开文g的文件描q字L?</p> <p>void pcap_perror(pcap_t *p, char *prefix) <br />在标准输备上昄最后一个pcap库错误消息。以prefix参数指定的字W串为消息头?</p> <p>char *pcap_geterr(pcap_t *p) <br />q回最后一个pcap库错误消息?</p> <p>char *pcap_strerror(int error) <br />如果strerror()函数不可用,则可调用pcap_strerror函数替代?</p> <p>void pcap_close(pcap_t *p) <br />关闭p参数相应的文Ӟq放资源?</p> <p>void pcap_dump_close(pcap_dumper_t *p) </p> <p>5、Libpcap的主要数据结构:<br /> <br />Libpcap库函数所必须的数据结构定义主要包含在pcap.h和pcap-int.h两个头文件中。其主要数据l构</p> <p>如下Q?br /> <br />(1)pcapl构<br /> <br />pcapl构在pcap-int.h头文件中被定义:<br /> <br />struct pcap<br />{<br />    int                fd;<br />    int                snapshot;<br />    int                linktype;<br />    int                tzoff;    /* timezone offset                                   */<br />    int                offset;   /* offset for proper alignment                       */<br />    struct pcap_sf     sf;<br />    struct pcap_md     md;<br />    int                bufsize;  /* Read buffer                                       */<br />    u_char *           buffer;<br />    u_char *           bp;<br />    int                cc;<br />    u_char *           pkt;      /* Place holder for pcap_next()                      */<br />    struct bpf_program fcode;    /* Placeholder for filter code if bpf not in kernel. */<br />    char               errbuf[PCAP_ERRBUF_SIZE];<br />};<br /> <br />(2)bpf_programl构<br /> <br />该结构在pcap_compile()函数中被使用Q在bpf.h头文件中定义?br /> <br />/usr/include/net/bpf.h</p> <p>/* Structure for BIOCSETF. */<br />struct bpf_program<br />{<br />    u_int             bf_len;<br />    struct bpf_insn * bf_insns;<br />};</p> <p>/*<br />* The instruction data structure.<br />*/<br />struct bpf_insn<br />{<br />    u_short   code;<br />    u_char    jt;<br />    u_char    jf;<br />    bpf_int32 k;<br />};<br /> <br />(3)pcap_pkthdrl构<br /> <br />/usr/include/pcap.h</p> <p>/*<br />* Each packet in the dump file is prepended with this generic header.<br />* This gets around the problem of different headers for different<br />* packet interfaces.<br />*/<br />struct pcap_pkthdr<br />{<br />    struct timeval ts;      /* time stamp                    */<br />    bpf_u_int32    caplen;  /* length of portion present     */<br />    bpf_u_int32    len;     /* length this packet (off wire) */<br />};</p> <p>/usr/include/net/bpf.h</p> <p>/*<br />* Structure prepended to each packet.<br />*/<br />struct bpf_hdr<br />{<br />    struct timeval bh_tstamp;   /* time stamp                 */<br />    bpf_u_int32    bh_caplen;   /* length of captured portion */<br />    bpf_u_int32    bh_datalen;  /* original length of packet  */<br />    u_short        bh_hdrlen;   /* length of bpf header (this struct<br />                                   plus alignment padding)    */<br />};<br /> <br />(4)pcap_statl构<br /> <br />struct pcap_stat {<br />        u_int ps_recv; /* number of packets received */<br />        u_int ps_drop; /* number of packets dropped */<br />        u_int ps_ifdrop; /* drops by interface XXX not yet supported */<br />};<br /><br />int main()<br />{<br />        bpf_u_int32 localnet,netmask;<br />        struct bpf_program fcode;<br />        pcap_handler printer;</p> <p>        pcap_dumper_t*p;<br />        char ebuf[PCAP_ERRBUF_SIZE];<br />        char * device;<br />        u_char * pcap_userdata;<br />        pcap_t * pd;<br />        int dev_flag=1;<br />        int cap_len=CAP_LEN;<br />        int i;</p> <p>        device=pcap_lookupdev(ebuf);<br />        if (device == NULL)<br />                exit(printf("%s n", ebuf));<br />        #ifdef _DEBUG_<br />        printf("device is %s \n",device);<br />        #endif<br />        pd=pcap_open_live(device,cap_len,dev_flag,1000,ebuf);<br />        if(pd == NULL)<br />                exit(printf("%s\n",ebuf));</p> <p>        i=pcap_snapshot(pd);<br />                if(cap_len < i) {<br />                printf("snaplen raised from %d to %d \n", cap_len, i);<br />                        cap_len=i;<br />                }<br />        if(pcap_lookupnet(device, &localnet, &netmask, ebuf) < 0) {<br />                        localnet=0;</p> <p>    netmask=0;<br />                        printf("%s\n", ebuf);<br />        }<br />        if (pcap_compile(pd, &fcode, "", 1, netmask) < 0)<br />                exit(printf("Error %s\n","pcap_compile"));<br />        if (pcap_setfilter(pd,&fcode) < 0)<br />                exit(printf("Error %s\n","pcap_setfilter"));</p> <p>        p=pcap_dump_open(pd,FILENAME);<br />                if(p == NULL)<br />                        exit(printf("Error:%s\n","pcap_dump_open"));<br />                printer=pcap_dump;<br />                pcap_userdata=(u_char *)p;</p> <p>        if(pcap_loop(pd, -1, printer, pcap_userdata) < 0)<br />                exit(printf("Error, %s\n","pcap_loop"));</p> <p>        pcap_close(pd);<br />        exit(0);<br />}</p> <p> </p> <img src ="http://www.aygfsteel.com/huyi2006/aggbug/139179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/huyi2006/" target="_blank">胡意</a> 2007-08-24 21:07 <a href="http://www.aygfsteel.com/huyi2006/articles/139179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket~程中需要用到的头文?/title><link>http://www.aygfsteel.com/huyi2006/articles/139176.html</link><dc:creator>胡意</dc:creator><author>胡意</author><pubDate>Fri, 24 Aug 2007 12:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/huyi2006/articles/139176.html</guid><wfw:comment>http://www.aygfsteel.com/huyi2006/comments/139176.html</wfw:comment><comments>http://www.aygfsteel.com/huyi2006/articles/139176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/huyi2006/comments/commentRss/139176.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/huyi2006/services/trackbacks/139176.html</trackback:ping><description><![CDATA[ <font face="宋体"> </font> <h2 align="left"> <font size="6">socket~程中需要用到的头文?/font> </h2> <font size="+2"> <p>sys/types.hQ数据类型定?/p> <p>sys/socket.hQ提供socket函数及数据结?/p> <p>netinet/in.hQ定义数据结构sockaddr_in</p> <p>arpa/inet.hQ提供IP地址转换函数</p> <p>netdb.hQ提供设|及获取域名的函?/p> <p>sys/ioctl.hQ提供对I/O控制的函?/p> <p>sys/poll.hQ提供socket{待试机制的函?/p> <h2> </h2> <h2> </h2> </font> <font size="6">其他在网l程序中常见的头文g</font> <font size="+2"> <p>unistd.hQ提供通用的文件、目录、程序及q程操作的函?/p> <p>errno.hQ提供错误号errno的定义,用于错误处理</p> <p>fcntl.hQ提供对文g控制的函?/p> <p>time.hQ提供有x间的函数</p> <p>crypt.hQ提供用DES加密法的加密函?/p> <p>pwd.hQ提供对/etc/passwd文g讉K的函?/p> <p>shadow.hQ提供对/etc/shadow文g讉K的函?/p> <p>pthread.hQ提供多U程操作的函?/p> <p>signal.hQ提供对信号操作的函?/p> <p>sys/wait.h、sys/ipc.h、sys/shm.hQ提供进E等待、进E间通讯QIPCQ及׃n内存的函?/p> <p> </p> </font> <p> <font size="6">Q?/font> <font size="5">在编写网l程序时Q可以直接用下面这D头文g代码</font> </p> <font size="+2"> <p> <font face="Times New Roman">#include <unistd.h><br />#include <sys/types.h><br />#include <sys/socket.h><br />#include <netdb.h><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#include <ctype.h><br />#include <errno.h><br />#include <malloc.h><br />#include <netinet/in.h><br />#include <arpa/inet.h><br />#include <sys/ioctl.h><br />#include <stdarg.h><br />#include <fcntl.h><br />#include <fcntl.h><br />  </font> </p> <p> </p> <p> <b>涉及到用h限及密码验证问题时加入如下语句:<br /></b> <font face="Times New Roman">#include <shadow.h><br />#include <crypt.h><br />#include <pwd.h></font> <br /> <font color="#ff0000">需要注意的是,应该在编译时链接加密法库,卛_加编译选项Q?br />-lcrypt</font> </p> <p>   </p> <p> </p> <p> <b>涉及到文件及旉操作加入如下语句Q?/b> <br /> <font face="Times New Roman">#include <sys/time.h><br />#include <utime.h><br />#include <time.h><br />#include <sys/stat.h><br />#include <sys/file.h><br />  </font> </p> <p> </p> <p> <b>涉及到多q程操作时加入如下语句:</b> <br /> <font face="Times New Roman">#include <sys/wait.h><br />#include <sys/ipc.h><br />#include <sys/shm.h><br />#include <signal.h></font> <br />  </p> <p> </p> <p> <b>涉及到多U程操作时加入如下语句:</b> <br /> <font face="Times New Roman">#include <pthread.h><br />#include <sys/poll.h><br /></font> <font color="#ff0000">需要注意的是,应该在编译时链接U程库,卛_加编译选项Q?br />-lthread</font> </p> </font> <img src ="http://www.aygfsteel.com/huyi2006/aggbug/139176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/huyi2006/" target="_blank">胡意</a> 2007-08-24 20:54 <a href="http://www.aygfsteel.com/huyi2006/articles/139176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 下安装libpcap (?手记 http://www.aygfsteel.com/huyi2006/articles/127361.html胡意胡意Sun, 01 Jul 2007 07:47:00 GMThttp://www.aygfsteel.com/huyi2006/articles/127361.htmlhttp://www.aygfsteel.com/huyi2006/comments/127361.htmlhttp://www.aygfsteel.com/huyi2006/articles/127361.html#Feedback4http://www.aygfsteel.com/huyi2006/comments/commentRss/127361.htmlhttp://www.aygfsteel.com/huyi2006/services/trackbacks/127361.html 
我最q开发个目Q要用到 libpcap 函数库,现将安装Ҏ攑֜主页上供大家参考,
一 下蝲libpcap ?文g的格式ؓx.tar.gz
      http://www.tcpdump.org/release/
?安装
     1、用
          #tar zxvf x.tat.gz
          命o解压文gC的当前目?/div>
     2、进入刚才解开的libpcap目录Q执?/div>
          #./configure
          命oQ生成Makefile文g
    3、输?
          #make install
          生成的库安装到pȝ默认目录中。此目录?/usr/lib Q如果需要修改,可以修改文gMakefile ?prefix?/div>
    4、输?
         #make install-incl
         头文g安装至系l默认目录,/usr/includeQ修改同?/div>
?使用
          如果要用libpcap,一般加?
          #include <pcap.h>
          ~译选项Q?cc .. -lpcap –lsocket ..
 
good luck
 


胡意 2007-07-01 15:47 发表评论
]]>IP首部查和的理?/title><link>http://www.aygfsteel.com/huyi2006/articles/118178.html</link><dc:creator>胡意</dc:creator><author>胡意</author><pubDate>Thu, 17 May 2007 13:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/huyi2006/articles/118178.html</guid><wfw:comment>http://www.aygfsteel.com/huyi2006/comments/118178.html</wfw:comment><comments>http://www.aygfsteel.com/huyi2006/articles/118178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/huyi2006/comments/commentRss/118178.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/huyi2006/services/trackbacks/118178.html</trackback:ping><description><![CDATA[很多文章对ip首部验和的计介l得很简略,在理解上常常会比较困难。这文章是我自q一些理解。或怹有不正确的地方,希望大家指正?br /><pre>q个问题一直困l了我很长时_今天l于理解了?<br /><br /><br />我们可以通过spynet sniffer抓包软gQ抓取一个ip数据包进行分析研I?<br />下面我以本机抓到的一个完整的ip首部ZQ红色字体表C)Q?<br /><br />0000: 00 e0 0f 7d 1e ba 00 13 8f 54 3b 70 08 00 45 00 <br />0010: 00 2e be 55 00 00 7a 11 51 ac de b7 7e e3 c0 a8 <br />0020: 12 7a <br /><br />45 00 00 2e----4表示ip版本号ؓipW?版;5表示首部长度??2 bit字长Q即?0字节Q?0 2e表示ip总长度ؓ46字节Q其中ip数据部分?<br />26字节?<br />be 55 00 00----be 55表示标识W;00 00表示3 bit标志?3 bit片偏U量Q?<br />7a 11 51 ac----7a表示ttlgؓ122Q?1表示协议号ؓ17的udp协议Q?1 ac表示16 bit首部验和| <br />de b7 7e e3----表示32 bit 源ip地址?22.183.126.227 <br />c0 a8 12 7a----表示32 bit 目的ip地址?92.168.18.122 </pre><pre><br /><br /><br />验和计算Q?<br />首先,把检验和字段|ؓ0?<br />45 00 00 2e <br />be 55 00 00 <br />7a 11 00 00<----验和|ؓ0 <br />de b7 7e e3 <br />c0 a8 12 7a <br />其次Q对整个首部中的每个16 bitq行二进制反码求和,求和gؓ3ae50Q然?+ae50=ae53Q这是根据源代码中算?cksum = (cksum <br />>> 16) + (cksum & 0xffff) q行?Q?<br /><br />最后,ae53+51ac=ffff。因此判断ip首部在传输过E中没有发生M差错?/pre><img src ="http://www.aygfsteel.com/huyi2006/aggbug/118178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/huyi2006/" target="_blank">胡意</a> 2007-05-17 21:43 <a href="http://www.aygfsteel.com/huyi2006/articles/118178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">п</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯׯ</a>| <a href="http://" target="_blank">Ұ</a>| <a href="http://" target="_blank">첼</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">Խ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ײ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">»</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank">˰</a>| <a href="http://" target="_blank">ֵ</a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ɳƺ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>