Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中将筛选器附加到原始套接字_C_Linux_Sockets_Network Programming_Setsockopt - Fatal编程技术网

C 在Linux中将筛选器附加到原始套接字

C 在Linux中将筛选器附加到原始套接字,c,linux,sockets,network-programming,setsockopt,C,Linux,Sockets,Network Programming,Setsockopt,这个问题是我们的下一步 我将代码更改为使用AF_数据包套接字,但这一次,我的应用程序需要处理大量流量。我决定使用LSF过滤器以减少应用程序的工作量 这是我的新计划: struct sock_fprog filter; int i, lineCount = 0; int sd; char tcpdump_command[512]; FILE* tcpdump_output; sprintf(tcpdump_command, "tcpdump \"udp && src %s &

这个问题是我们的下一步

我将代码更改为使用AF_数据包套接字,但这一次,我的应用程序需要处理大量流量。我决定使用LSF过滤器以减少应用程序的工作量

这是我的新计划:

struct sock_fprog filter;
int i, lineCount = 0;
int sd;
char tcpdump_command[512];
FILE* tcpdump_output;
sprintf(tcpdump_command, "tcpdump \"udp && src %s && src port %d\" -ddd -s 1600", IP, PORT);
if ( (tcpdump_output = popen(tcpdump_command, "r")) == NULL ) {
    perror("Cannot compile filter using tcpdump.");
    return;
}
if ( fscanf(tcpdump_output, "%d\n", &lineCount) < 1 ) {
    printf("cannot read lineCount.\n");
    return;
}
filter.filter = calloc(sizeof(struct sock_filter)*lineCount,1);
filter.len = lineCount;
for ( i = 0; i < lineCount; i++ ) {
    if (fscanf(tcpdump_output, "%u %u %u %u\n", &(filter.filter[i].code), &(filter.filter[i].jt), &(filter.filter[i].jf), &(filter.filter[i].k)) < 4 ) {
        printf("error in reading line number: %d\n", (i+1));
        return;
    }
}
pclose(tcpdump_output);

sd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if ( sd == -1 )
{
    perror("error in opening sd\n");
    return;
}

if (setsockopt(sd, SOL_PACKET, SO_ATTACH_FILTER, &filter, sizeof(filter)) < 0 )
{
    perror("Cannot attach filter");
    return -5;
}
struct sock\u fprog过滤器;
int i,行数=0;
国际标准差;
char tcpdump_命令[512];
文件*tcpdump\u输出;
sprintf(tcpdump_命令,“tcpdump\”udp&&src%s&&src端口%d\“-ddd-s 1600”,IP,端口);
if((tcpdump_输出=popen(tcpdump_命令,“r”))==NULL){
perror(“无法使用tcpdump编译筛选器”);
返回;
}
if(fscanf(tcpdump_输出,“%d\n”,&lineCount)<1){
printf(“无法读取行计数。\n”);
返回;
}
filter.filter=calloc(sizeof(struct sock\u filter)*行数,1);
filter.len=行数;
对于(i=0;i

根据,套接字的初始化似乎是正确的。但是,最终的
setsockopt
会因“协议不可用”而失败。如果您有任何建议,我们将不胜感激。

请使用内核文档中的SOL_SOCKET

Ioctls-

setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter));
setsockopt(sockfd, SOL_SOCKET, SO_DETACH_FILTER, &value, sizeof(value));
setsockopt(sockfd, SOL_SOCKET, SO_LOCK_FILTER, &value, sizeof(value));

使用
SOCK_RAW
需要特定许可;您的应用程序是否以具有此权限的用户身份运行?如果是这样,您的系统是否拥有超出用户权限范围的权限(例如对精细控制功能的应用程序权限)?@mah我以root用户身份运行此程序。此外,如果我没有将筛选器附加到套接字,我可以从该套接字接收数据包(实际上,很多数据包)。请记住,这不会筛选在您试图调用
setsockopt
之前接收到的数据包,因此后续调用
recv