pcap_dispatch /å°†å‚数传递给回调函数

时间:2012-02-11 19:01:33

标签: c network-programming libpcap

int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

我ç†è§£pcap_dispatch在收到数æ®åŒ…åŽè°ƒç”¨å›žè°ƒä¾‹ç¨‹ï¼Œä¼ é€’给回调例程的第一个å‚数是pcap_dipatch函数的最åŽä¸€ä¸ªå‚数。那么回调例程的剩余两个å‚数呢? pcap_dispatch在哪里获å–è¦ä¼ é€’的其他å‚数?

2 个答案:

答案 0 :(得分:2)

其他两个å‚æ•°æ¥è‡ªåˆšæ•èŽ·çš„æ•°æ®åŒ…(如果您使用pcap_open_live()或pcap_create() / pcap_activate()打开pcap_t)或从æ•èŽ·ä¸­è¯»å–file(如果您使用pcap_open_offline()打开pcap_t) - pkthdr是一个结构,包å«æ•°æ®åŒ…的时间戳,网络上出现的数æ®åŒ…长度,以åŠæ•°æ®åŒ…被快照长度缩短åŽçš„长度,packet是原始数æ®åŒ…æ•°æ®ã€‚

答案 1 :(得分:1)

我ä¸å®Œå…¨ç¡®å®šæˆ‘明白你的è¦æ±‚,但我想我å¯èƒ½èƒ½å¤Ÿè¦†ç›–它。

首先,调度处ç†ç¨‹åºåªæ˜¯ä¸Žæ­¤ç­¾å匹é…的函数:

void packethandler( u_char *args, const struct pcap_pkthdr* pkthdr, 
                    const u_char* packet )

从å³åˆ°å·¦ï¼Œæœ‰ä»Žlibpcap包中æå–çš„æ•°æ®åŒ…已从网络接å£ï¼Œpcapæ ¼å¼åŒ…头和包处ç†ç¨‹åºçš„å‚数中æå–出æ¥ã€‚

我想如果有的è¯ï¼Œç¬¬ä¸€ä¸ªè®ºç‚¹å¯èƒ½ä¼šå¼•èµ·ä½ çš„问题。如果你需è¦ä¼ é€’多个å‚数,你å¯ä»¥è¿™æ ·åš - 它ä¸æ˜¯ä½ æ‰€æœŸæœ›çš„。如果你想传递多个å‚数,你å¯ä»¥ç®€å•åœ°å®šä¹‰ä¸€ä¸ªç»“构,而ä¸æ˜¯ä½¿ç”¨va_args。å‡è®¾typedef struct { ... } myparams;您å¯ä»¥é€šè¿‡ï¼š

(u_char*) myparamstruct

作为å‚数并在处ç†ç¨‹åºå†…执行:

myparams* params = (myparams*) args;

这是有效的,因为你传递的是指针,而ä¸æ˜¯æ•°æ®ã€‚指针的类型简å•åœ°æ述了底层的,解除引用的ä½ç½®ç±»åž‹ï¼ˆä¸€ç§è§£é‡Šæ•°æ®çš„æ–¹å¼ï¼‰ï¼Œè€Œä¸æ˜¯æŒ‡é’ˆçš„实际值 - 因为所有指针都是相åŒçš„宽度(无论如何,为此目的)。

所以这å¯èƒ½åŒ…括获å–这些å‚数。至于剩下的两个å‚数,正如我之å‰æ‰€è¯´ï¼Œè¿™äº›æ˜¯libpcap从指定的网络接å£æ•èŽ·çš„。实质上,æ¯æ¬¡æˆåŠŸæå–æ•°æ®åŒ…时,都会通过函数指针调用处ç†ç¨‹åºï¼Œå¹¶åœ¨è¿™äº›å‚数中编ç æ•°æ®åŒ…详细信æ¯å¹¶é€šè¿‡ç”¨æˆ·æ供的å‚数指针。