freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

網(wǎng)絡爬蟲論word版-資料下載頁

2025-01-07 18:09本頁面
  

【正文】 t close(int sockfd)。 參數(shù): sockfd 為 socket 函數(shù)返回的套接字描述符。 返回: 成功返回 0,反之返回 1。 ( 5)其它重要 函數(shù) 前文提到了 gethostbyname 函數(shù),它通過傳入 hostname 來返回主機名,結果指向一個 struct hostent 類型的結構體。函數(shù)原型: include struct hostent *gethostbyname(const char *hostname)。 參數(shù): hostname 為用戶指定的域名。 返回: 成功返回非空指針,反之則為 NULL。 // 例子(摘自 ) if((Host = gethostbyname(())) == NULL) { return 1。 } 在文本使用的爬蟲中, gethostbyname 函數(shù)只需調(diào)用一次,因為本文前提是在同一域名下抓取網(wǎng)頁。當然如果抓取范圍沒有限制,則需對不同域名的網(wǎng)站多次調(diào)用該函數(shù)。 // SetNoblocking 函數(shù)(摘自 ) int SetNoblocking(const intamp。 sockfd) { int opts = ftl(sockfd, F_GETFL)。 // get file_flag and access model if (opts 0) return 1。 opts |= O_NONBLOCK。 // set nonblocking if (ftl(sockfd, F_SETFL, opts) 0) return 1。 } SetNonblocking 函數(shù)不是系統(tǒng)函數(shù),本文把它單獨提出來是因為它是實現(xiàn)非阻塞讀寫、 connect 等操作的開關。 EPOLL 模型及其使用 ( 1) EPOLL 模型介紹 在 Linux 網(wǎng)絡編程中,大家常用的是多路復用 IO 接口 select/poll 來觸發(fā)事件,在這里介紹它的增強版 epoll。與 select/poll 相比, epoll 最大的好處是不會隨著 fd 的增加而第四章 網(wǎng)絡爬蟲模 型的設計與實現(xiàn) 21 降低效率,因為 select/poll 是通過輪詢來處理事件的,因此會隨著 fd 的增加效率降低。 在 epoll 中,首先需要了解的有三個函數(shù): int epoll_create(int size)。 該函數(shù)用來創(chuàng)建一個 epoll 的文件描述符。 參數(shù) size:能夠最大監(jiān)聽的 socket fd 數(shù)目。在使用完 epoll 后,必須調(diào)用 close()關閉。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)。 該函數(shù)用于控制某個 epoll 文件描述符上的事件:注冊事件,修改事件,刪除事件。 返回: 如果調(diào)用成功返回 0,不成功返回 1。 參數(shù): epfd 為 epoll 生成的專用 fd。 op 表 示 要 操 作 的 事 件 , 有 EPOLL_CTL_ADD , EPOLL_CTL_MOD ,POLL_CTL_DEL。 fd 表示需要監(jiān)聽的 fd。 event 是指向 epoll_event 的指針,告訴內(nèi)核需要監(jiān)聽什么事。 int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); 該函數(shù)用于輪詢 I/O 事件的發(fā)生。 返回: 返回需要處理的事件數(shù)目,如返回 0 表示超時。 參數(shù): epfd 是 poll 生成的專用 fd。 events 是用于回傳代處理事件的數(shù)組。 maxevents 告訴內(nèi)核這個 events 有多大,一般來說 maxevents 的值不能大于創(chuàng)建epoll_create()時的 size。 timeout:超時時間(毫秒)。如果是 0,則會立即返回, 1 表示不確定。 ( 2) EPOLL 在程序中的使用 在文中,使用 EPOLL 模型 來實現(xiàn)非阻塞式的 I/O,在使用之前必須設置 sockfd 為非阻塞類型。使用非阻塞 I/O 模型的好處在于可以進一步提高進程中讀寫的并發(fā)性,進而提高程序運行效率。 程序框架如下(摘自 ,參考 blogs): epfd = epoll_create(50)。 for(int i=0。 in。 i++) { struct argument *arg=new struct argument。 argurl = url_t。 argsockfd = sockfd。 = arg。 = EPOLLIN | EPOLLOUT | EPOLLET。 廣東石油化工學院本科畢業(yè) (設計 )論文 : Linux 平臺下 C/C++網(wǎng)絡爬蟲的設計與實現(xiàn) 22 if(epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, amp。ev) == 1) { // deal with error here } } while(1) { if(t=MAX_URL) break。 int n = epoll_wait(epfd, events, 10, 2022)。 // others for(int i=0。 in。 i++) { // deal with events if(epoll_ctl(epfd, EPOLL_CTL_DEL, argsockfd, amp。ev) == 1) { epoll_ctl(epfd, EPOLL_CTL_MOD, argsockfd, amp。ev)。 perror(epoll_ctl_del)。 continue。 } } } 上文 while 循環(huán)為 epoll 處理事件的核心,它通過 epoll_wait 得到等待隊列中的事件,然后在循環(huán)內(nèi)處理事件(通過使用多 線程技術,繼續(xù)注冊事件,實現(xiàn)并行處理,將在下一節(jié)做詳細介紹),最后注銷已處理的事件。要注意的是,每次處理一個事件,必須注銷該事件,否則在多線程下會出現(xiàn)重復處理某一事件的情況,嚴重時導致棧溢出,使程序崩潰。 POSIX 多線程及其使用 ( 1) POSIX 介紹 POSIX 線程,也稱 Pthread。下面介紹的函數(shù)都以跑 thread_開頭,限于篇幅,只介紹本程序使用的幾個線程函數(shù)。 include int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func)(void *), void *arg)。 參數(shù): tid 為線程 id。 attr 為線程屬性。 func 是一個函數(shù)指針,指向要調(diào)用的函數(shù)。 arg 是為 func 準備的參數(shù),需要自己指定,若無參數(shù),則可以用 NULL 代替。 第四章 網(wǎng)絡爬蟲模 型的設計與實現(xiàn) 23 返回:成功返回 0,反之返回一個正的錯誤指示。 include int pthread_detach(pthread_t tid)。 參數(shù): tid 表示線程 id。 返回: 成功返回 0,出錯返回一個正的錯誤指示 。 該函數(shù)用來設定線程 id 為 tid 的線程是可脫離的,確切地說,當 tid 終止時,所有相關資源自動釋放,主線程并不用等待它結束。在本程序中,并沒有調(diào)用此函數(shù),而是在線程屬性的設置中把線程設定為可脫離的。 include void pthread_exit(void *status)。 參數(shù): status 常設為 NULL。返回:不返回到調(diào)用者 ( 2) POSIX 多線程在程序中的使用 POSIX 多線程在本論文中的框架如下(摘自 amp。 ): pthread_attr_t pAttr。 pthread_t thread。 pthread_attr_init(amp。pAttr)。 pthread_attr_setstacksize(amp。pAttr, 8 * 1024 * 1024)。 pthread_attr_setdetachstate(amp。pAttr, PTHREAD_CREATE_DETACHED)。 int r = pthread_create(amp。thread, amp。pAttr, GetResponse, arg)。 pthread_attr_destroy(amp。pAttr)。 pthread_exit(NULL)。 多線程能提高程序的運行效率,但它同時也會造成程序崩潰,所以必須合理使用多線程,搭配使用。這里要介紹的搭檔就是互斥鎖。 在多線程條件下,某一變量(大多是全局變量),某個函數(shù)可能會同時被多個線程操作和訪問,但它們又不允許被同時操作,如何才能兩全呢?方法有多種,比如信號量,互斥鎖等。在本程序中使用的就是互斥鎖。 在程序中,有一些被定義了全局的變量,它們都是不允許同時操作的: queueURLque。 // used to store being fetched URLs int pending = 0。 // used to count pending events 通過定義 pthread_mutex_t 類型的變量 quelock, connlock 來創(chuàng)建鎖,在使用它們之前必須初始化。 pthread_mutex_t quelock = PTHREAD_MUTEX_INITIALIZER。 pthread_mutex_t connlock = PTHREAD_MUTEX_INITIALIZER。 這里要注意的是,如果某個互斥鎖變量是靜態(tài)分配的,就必須把它初始化常 量PTHREAD_MUTEX_INITIALIZER;反之,如果在共享內(nèi)存區(qū)中分配一個互斥鎖,那么廣東石油化工學院本科畢業(yè) (設計 )論文 : Linux 平臺下 C/C++網(wǎng)絡爬蟲的設計與實現(xiàn) 24 必須通過調(diào)用 pthread_mutex_init 函數(shù)在運行時把它初始化。鎖創(chuàng)建好了,那么如何使用呢? POSIX 使用了兩個函數(shù)用來上鎖和解鎖。 include int pthread_mutex_lock(pthread_mutex_t *mptr)。 int pthread_mutex_unlock(pthread_mutex_t *mptr)。 例(摘自 ):出隊列操作 pthread_mutex_lock(amp。quelock)。 URL url_t = ()。 ()。 pthread_mutex_unlock(amp。quelock)。 第六章 總結與展望 25 第五章 程序運行及結果分析 Makefile 及編譯 Makefile 文件的編寫有自己的一套語法結構,以本文使用的爬蟲源文件作為例子。 在本例子中涉及如下文件: // 主文件 , main 函數(shù)入口 // 包含與 socket 通信有關的函數(shù) // 的頭文件 // 包含與 URLs, Pages 有關的函數(shù) // 的頭文件 // 配置文件 總共 6 個文件 , 不算多 , 因此 Makefile 文件也不算復雜 , 內(nèi)容如下 : all: spider CPPFLAGS = O Wall lpthread OBJ = spider: $(OBJ) g++ o spider $(OBJ) $(CPPFLAGS) .: g++ c $ .PHONY: clean cleanall clean: rm spider *.o cleanall: make clean amp。amp。 rm ./Pages/*.html 參數(shù)解釋如下: all: 常用于指明要執(zhí)行的對象; CPPFLAGS : 用來標明編譯時的附加參數(shù); $(OBJ): 用來取 OBJ 的值; spider: 生成的應用程序名; lpthread: 編譯多線程文件必須加上; $: 依賴目標中的第一個目標名字, $^表示所有依賴 ; .PHONY: 用來指明假想的工作目標; 廣東石油化工學院本科畢業(yè) (設計 )論文 : Linux 平臺下 C/C++網(wǎng)絡爬蟲的設計與實現(xiàn) 26 .cpp: cpp 文件; .o: .o 文件; .: 意為把 .cpp 文件轉換為 .o 文件 clean: 使用 make clean 命令可以刪除 .o 文件; cleanall: 除了刪除 .o 文件,還要清空 Pages 下的網(wǎng)頁。 make clean/make cleanall 可以清除上次的編譯信息和文件; make all/make 可以編譯該爬蟲。其中 rm 前加 39。39。符號可以忽略執(zhí)行時的錯誤,從而繼續(xù)下一條命令。 運行及結果分析 ( 1) 運行 編譯前爬蟲文件代碼構成如圖 51 所示: 圖 51 編譯前文件代碼構成
點擊復制文檔內(nèi)容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1