在我的嵌入式設備中寫了一個抓包程序,獲取協議號的信息,結果在調用getprotobynumber時老是出錯 返回的protoent結構指針始終為空,打印了調試信息 [cpp] src_addr:192.168.5.155,dst_addr:180.153.201.235 ip_p=6------- protoent is NULL!!!! src_addr:180.153.201.235,dst_addr:192.168.5.155 ip_p=6------- protoent is NULL!!!! src_addr:192.168.5.155,dst_addr:180.153.201.235 ip_p=6------- protoent is NULL!!!! src_addr:180.153.201.235,dst_addr:192.168.5.155 ip_p=6------- protoent is NULL!!!! 在網上查到關於這個函數的博客,http://yadang418.blog.163.com/blog/static/2684365620096101121612/ 裡面有一句話”此函數會從 /etc/protocols中查找符合條件的數據並由結構protoent返回“,才想到我的設備/etc下沒這個文件 復制linux下的進去試試,再運行,ok了!! [cpp] src_addr:192.168.5.152,dst_addr:238.8.8.8 ip_p=17------- pro_name :udp udp src_port:60597,dst_port:11111 src_addr:192.168.5.30,dst_addr:255.255.255.255 ip_p=17------- pro_name :udp udp src_port:3601,dst_port:3600 src_addr:192.168.5.152,dst_addr:238.8.8.8 ip_p=17------- pro_name :udp udp src_port:60597,dst_port:11111 src_addr:192.168.5.152,dst_addr:238.8.8.8 ip_p=17------- pro_name :udp udp src_port:60597,dst_port:11111 相關函數:getprotobyname, getprotoent, setprotoent, endprotoent 表頭文件:#include <netdb.h> 函數定義:struct protoent *getprotobynumber(int proto) 函 數說明:getprotobynumber()會返回一個protoent結構,參數proto為欲查詢的網絡協議編號。此函數會從 /etc/protocols中查找符合條件的數據並由結構protoent返回。 結構protoent定義請參getprotoent() 返回值 :成功則返回protoent結構指印,若有錯誤或找不到各個符合的數據則返回NULL指針 struct protoent結構 [cpp] /* Description of data base entry for a single service. */ struct protoent { char *p_name; /* Official protocol name. */ char **p_aliases; /* Alias list. */ int p_proto; /* Protocol number. */ }; getprotobyname():依照通訊協定 (protocol) 的名稱來獲取該通訊協定的其他資料。 格 式: struct protoent * getprotobyname( const char *name ); 參 數: name 通訊協定名稱 傳回值: 成功 - 一指向 struct protoent 的指針 失敗 - NULL 說明: 利用通訊協定的名稱來得知該通訊協定的別名、編號等資料。 getprotobynumber():依照通訊協定的編號來獲取該通訊協定的其他資料。 格 式: struct protoent * getprotobynumber( int number ); 參 數: number 以 host 排列方式的通訊協定編號 傳回值: 成功 - 一指向 struct protoent 的指針 失敗 - NULL 說明: 利用通訊協定的編號來得知該通訊協定的名稱、別名等資料。 =============2.6.31內核================ [cpp] /* Open protocol data base files and mark them as staying open even after a later search if STAY_OPEN is non-zero. This function is a possible cancellation point and therefore not marked with __THROW. */ extern void setprotoent (int __stay_open); /* Close protocol data base files and clear `stay open' flag. This function is a possible cancellation point and therefore not marked with __THROW. */ extern void endprotoent (void); /* Get next entry from protocol data base file. Open data base if necessary. This function is a possible cancellation point and therefore not marked with __THROW. */ extern struct protoent *getprotoent (void); /* Return entry from protocol data base for network with NAME. This function is a possible cancellation point and therefore not marked with __THROW. */ extern struct protoent *getprotobyname (__const char *__name); /* Return entry from protocol data base which number is PROTO. This function is a possible cancellation point and therefore not marked with __THROW. */ extern struct protoent *getprotobynumber (int __proto);