首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

为什么libnids只能捕获单向数据流,而不是双向的解决思路

2012-05-23 
为什么libnids只能捕获单向数据流,而不是双向的各位大侠:我的捕获HTTP协议数据流的Libnids 程序,只能捕获

为什么libnids只能捕获单向数据流,而不是双向的
各位大侠:
  我的捕获HTTP协议数据流的Libnids 程序,只能捕获响应报文,而不能捕获请求包,是怎么回事/? 是不是libnids需要进行特殊设置还是什么的啊?我的程序放在别人那就能正常执行,真郁闷!!!!!!!!!!
  是这样的,我用自己的电脑做客户端,然后点击新浪博客,但是只能接受到服务器发给我的信息。而我的请求信息则一个也收不到。
  急急。

[解决办法]
因为你网卡的驱动不计算校验和,而由硬件完成,当libnids发现你发送的没有计算校验和的数据包就丢弃了,只要让libnids忽略这一点就可以了。加入以下代码:

C/C++ code
/* Example 2: disabling checksums of packets with src ip of any local interface */static int get_all_ifaces(struct ifreq **, int *);static unsigned int get_addr_from_ifreq(struct ifreq *);int all_local_ipaddrs_chksum_disable(){    struct ifreq *ifaces;    int ifaces_count;    int i, ind = 0;    struct nids_chksum_ctl *ctlp;    unsigned int tmp;    if (!get_all_ifaces(&ifaces, &ifaces_count))        return -1;    ctlp =        (struct nids_chksum_ctl *) malloc(ifaces_count *                          sizeof(struct                             nids_chksum_ctl));    if (!ctlp)        return -1;    for (i = 0; i < ifaces_count; i++) {        tmp = get_addr_from_ifreq(ifaces + i);        if (tmp) {            ctlp[ind].netaddr = tmp;            ctlp[ind].mask = inet_addr("255.255.255.255");            ctlp[ind].action = NIDS_DONT_CHKSUM;            ind++;        }    }    free(ifaces);    nids_register_chksum_ctl(ctlp, ind);}/* helper functions for Example 2 */unsigned int get_addr_from_ifreq(struct ifreq *iface){    if (iface->ifr_addr.sa_family == AF_INET)        return ((struct sockaddr_in *) &(iface->ifr_addr))->            sin_addr.s_addr;    return 0;}static int get_all_ifaces(struct ifreq **ifaces, int *count){    int ifaces_size = 8 * sizeof(struct ifreq);    struct ifconf param;    int sock;    unsigned int i;    *ifaces = malloc(ifaces_size);    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);    if (sock <= 0)        return 0;    for (;;) {        param.ifc_len = ifaces_size;        param.ifc_req = *ifaces;        if (ioctl(sock, SIOCGIFCONF, &param))            goto err;        if (param.ifc_len < ifaces_size)            break;        free(*ifaces);        ifaces_size *= 2;        ifaces = malloc(ifaces_size);    }    *count = param.ifc_len / sizeof(struct ifreq);    close(sock);    return 1;      err:    close(sock);    return 0;} 

热点排行