int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
我ç†è§£pcap_dispatch
在收到数æ®åŒ…åŽè°ƒç”¨å›žè°ƒä¾‹ç¨‹ï¼Œä¼ 递给回调例程的第一个å‚数是pcap_dipatch
函数的最åŽä¸€ä¸ªå‚数。那么回调例程的剩余两个å‚数呢? pcap_dispatch
在哪里获å–è¦ä¼ 递的其他å‚数?
ç”案 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从指定的网络接å£æ•èŽ·çš„。实质上,æ¯æ¬¡æˆåŠŸæå–æ•°æ®åŒ…时,都会通过函数指针调用处ç†ç¨‹åºï¼Œå¹¶åœ¨è¿™äº›å‚æ•°ä¸ç¼–ç æ•°æ®åŒ…详细信æ¯å¹¶é€šè¿‡ç”¨æˆ·æ供的å‚数指针。