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

正文內(nèi)容

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

2025-01-07 18:09本頁(yè)面
  

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