青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

jake1036

larbin源碼分析(一) gloabl文件 Connexion結構

larbin源碼分析(一) 從gloabl文件分析每一個結構

  一 本系列主要是分析larbin開源爬蟲的源代碼,主要思路是先從global文件中的各個重要的結構開始。
     1   Connexion 此處為一個結構體
          該結構體主要的作用是進行連接服務器的操作。其中析構函數基本不執行,因為此結構是循環利用的,在
          程序中保持一定的數量。小擴展:FetchOpen 類主要用來建立連接,而FetchPipe類主要用來進行連接之后的數據交換。
       結構體中成員變量
        struct Connexion{
            char state ; //表示socket的狀態EMPTY , CONNECTING , WRITE . OPEN
            int pos ;    //請求被發送到的位置
            FetchError err ; //查詢如何終止的
            int socket ;  // number of the fds
            int timeout ;  //鏈接的超時值
           LarbinString request ; //http 請求報頭
           file * parser ; //對下載的網頁進行解析
           char buffer[maxPageSize] ;  //存儲下載的網頁數據
          Connexion() ;
         ~Connexion() ;
       //recycle
         void recycle() ; //此處主要進行循環使用
     } ;
 2 具體成員函數的實現
  

Connexion::Connexion() //具體將socket的狀態變為emptyC
{                                  //將文件解析句柄變為空
  state = emptyC ;
  parser = NULL ; 

}
 Connexion::~Connexion()  //保證一旦調用,即報告錯誤
{
  assert(false) ;
}
 
/*recycle a connexion*/
void Connexion::recycle() //循環使用該結構體
{
  delete parser ;              //刪除解析對象
  request.recycle() ;        //對LarbinString 調用recycle函數。
}

 3 utils包下的connexion.h 和 connexion.cc的具體代碼實現
   

// Larbin
// Sebastien Ailleret
// 15-11-99 -> 14-12-99

#ifndef CONNEXION_H
#define CONNEXION_H

/* make write until everything is written
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrire (int fd, char *buf);

/* make write until everything is written
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrireBuff (int fd, char *buf, int count);

/** Write an int on a fds
 * (uses ecrire)
 
*/

int ecrireInt (int fd, int i);
int ecrireInt2 (int fd, int i);
int ecrireInti (int fd, int i, char *f);
int ecrireIntl (int fd, long i, char *f);

/** Write an int on a fds
 * (uses ecrire)
 
*/

int ecrireLong (int fd, long i);

/* Write a char on a fds
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrireChar (int fd, char c);


#endif // CONNEXION_H


 在connexion.h中各個成員函數的作用主要是向套接字中寫入數據。
  寫入操作中主要使用了 write 系統調用。
  unistd.h中
  ssize_t write(int fd , char * buf , int count)
  若是發生寫錯誤,則返回值為-1 ,但是若此時的錯誤狀態為EINTR ,則表示是發生了中斷操作,此時應該繼續進行寫操作。
  若是當前執行的寫操作出現了等待的事情,則不需要報錯,應該繼續寫,直到等待的事情結束。
  (1) 誤區
         write并不是立即執行寫操作,而是將數據寫入進內核緩沖區。
         一般內核區比較穩定,不會出現問題。
         

 (4)下面是connexion的實現代碼
      

// Larbin
// Sebastien Ailleret
// 15-11-99 -> 03-05-01

#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<unistd.h>
#include 
<string.h>
#include 
<sys/socket.h>
#include 
<netinet/in.h>
#include 
<netinet/tcp.h>
#include 
<ctype.h>
#include 
<netdb.h>
#include 
<arpa/inet.h>
#include 
<errno.h>
#include 
<iostream>

#include 
"options.h"
using namespace std ;

/*********************************/
/* various functions for writing */

/* make write until everything is written
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrire (int fd, char *buf) {
  
int pos = 0 ; 
  
int len = strlen(buf); 
  
while(pos < len)
  
{
     
int i = write(fd , buf + pos, len - pos) ; 
     
if(i == -1)    
     
{
       
if(errno != EINTR)
        
{
          pos 
= len + 1 ;
        }

     }
   
     
else{
      pos 
+= i ;
    }

  }

   
return pos != len ;
}


/* make write until everything is written
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrireBuff (int fd, char *buf, int count) {
  
int pos = 0;
  
while(pos < count)
  
{
     
int i = write(fd , buf + pos , count - pos) ;
    
if(i == -1)  
    
{
     
switch(errno)
     
{
       
case EINTR :
         
break ;
       
default:
         pos 
= count + 1 ; 
         perror(
"buf error") ;
         
break;
     }

    }

    
else
     pos 
+= i ; 
  }

  
return pos != count;
}




/** Write an int on a fds
 * (uses ecrire)
 
*/

int ecrireInt (int fd, int i) {
  
char buf[20];
  sprintf(buf, 
"%d", i);
  
return ecrire(fd, buf);
}


int ecrireInt2 (int fd, int i) {
  
char buf[20];
  sprintf(buf, 
"%d%c", i/10, i%10 + '0');
  
return ecrire(fd, buf);
}


int ecrireInti (int fd, int i, char *f) {
  
char buf[100];
  sprintf(buf, f, i);
  
return ecrire(fd, buf);
}


int ecrireIntl (int fd, long i, char *f) {
  
char buf[100];
  sprintf(buf, f, i);
  
return ecrire(fd, buf);
}


/** Write an int on a fds
 * (uses ecrire)
 
*/

int ecrireLong (int fd, long i) {
  
char buf[30];
  sprintf(buf, 
"%ld", i);
  
return ecrire(fd, buf);
}


/* Write a char on a fds
 * return 0 on success, 1 otherwise
 * Don't work on non-blocking fds
 
*/

int ecrireChar (int fd, char c) {
  
int pos = 0;
  
while (pos < 1{
    
int i = write(fd, &c, 1);
    
if (i == -1{
      
if (errno != EINTR) {
        pos 
= 2;
      }

    }
 else {
      pos 
+= i;
    }

  }

  
return pos != 1;
}


(5)綜上
     Connexion主要處理的是連接相關的信息,其connexion中主要實現的是,向套接字中寫入數據。
     下一個系列,處理的是LarbinString 相關,該類主要是處理http報頭的。

        

posted on 2011-06-11 16:05 kahn 閱讀(1442) 評論(0)  編輯 收藏 引用 所屬分類: larbin源碼分析

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩天天操| 国产亚洲福利一区| 亚洲精品女人| 亚洲人成在线观看网站高清| 欧美激情在线| 亚洲午夜av在线| 国产日本精品| 久久久www成人免费无遮挡大片 | 亚洲女人天堂av| 国产欧美日韩综合| 久久一日本道色综合久久| 美女精品网站| 中文国产亚洲喷潮| 午夜精品久久久久久久男人的天堂 | 国产日韩一区| 久久影院亚洲| 欧美日韩国产精品自在自线| 亚洲欧美久久| 久久漫画官网| 亚洲字幕在线观看| 久久久一区二区三区| 一区二区三区久久| 欧美在线免费视频| 99精品国产热久久91蜜凸| 亚洲无亚洲人成网站77777| 韩日成人av| av不卡在线观看| 激情欧美一区二区三区| av成人福利| 亚洲高清免费| 亚洲欧美国产一区二区三区| 亚洲激情午夜| 亚洲欧美在线磁力| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美日韩天堂一区二区| 亚洲精品欧洲| 久久成人精品一区二区三区| 亚洲亚洲精品在线观看| 久久综合影音| 久久久xxx| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 1769国产精品| 亚洲欧美电影在线观看| av成人免费在线| 美日韩精品免费观看视频| 久久精品综合网| 国产精品拍天天在线| 亚洲日韩视频| 亚洲精品在线看| 老司机aⅴ在线精品导航| 欧美在线视频免费观看| 国产精品久久久久久久久果冻传媒 | 激情91久久| 亚洲欧美自拍偷拍| 午夜精品久久久久影视| 欧美日韩情趣电影| 亚洲乱码精品一二三四区日韩在线 | 亚洲电影有码| 久久久久久久久久码影片| 久久av在线看| 国产精品亚洲综合| 亚洲欧美www| 午夜亚洲影视| 国产欧美欧美| 欧美一区三区三区高中清蜜桃| 午夜视频久久久| 国产精品一区二区久久久久| 亚洲综合丁香| 久久爱www久久做| 国产一区久久| 久久三级视频| 亚洲国产婷婷综合在线精品| 日韩午夜激情| 欧美午夜激情视频| 亚洲欧美一级二级三级| 久久精品国产96久久久香蕉| 国产一区二区三区黄| 久久久久欧美精品| 欧美激情在线免费观看| 日韩网站在线观看| 国产精品裸体一区二区三区| 亚洲免费在线观看视频| 久久久亚洲精品一区二区三区| 激情五月综合色婷婷一区二区| 久久久久久精| 亚洲精品在线免费观看视频| 午夜精品婷婷| 一区二区在线观看av| 欧美精品一区二区三区很污很色的| 亚洲九九爱视频| 久久se精品一区二区| 在线不卡中文字幕| 欧美日韩精品免费观看| 亚洲欧美中文另类| 欧美黑人多人双交| 亚洲欧美国产高清va在线播| 好看不卡的中文字幕| 欧美精品久久99| 欧美亚洲综合网| 亚洲九九九在线观看| 久久久99久久精品女同性| 亚洲理论在线| 国产有码在线一区二区视频| 欧美精品18+| 欧美一区二区观看视频| 亚洲精品视频免费观看| 麻豆精品精华液| 亚洲伊人第一页| 亚洲日韩欧美视频一区| 国产日韩综合| 欧美视频在线观看一区| 免费日本视频一区| 欧美在线一级va免费观看| 亚洲美女91| 欧美激情一区二区三级高清视频 | 欧美一级久久久| 99国产一区| 影音欧美亚洲| 国产亚洲欧美日韩一区二区| 欧美巨乳在线| 免费成人在线视频网站| 欧美一区二区国产| 亚洲视屏在线播放| 亚洲精品在线三区| 亚洲国产精品99久久久久久久久| 午夜精品美女久久久久av福利| 日韩视频―中文字幕| 亚洲国产精品电影| 在线观看国产精品网站| 国产亚洲一区在线| 国产日韩欧美高清免费| 国产精品视频九色porn| 国产精品久久久久aaaa樱花| 欧美日本亚洲韩国国产| 欧美黑人国产人伦爽爽爽| 老司机精品视频一区二区三区| 久久精品国产清高在天天线| 午夜精品剧场| 欧美亚洲一区二区在线| 欧美一级播放| 欧美专区18| 久久精品国产v日韩v亚洲| 久久精品日韩欧美| 久久久久久高潮国产精品视| 久久久久久久久久久久久9999| 久久国产直播| 久热综合在线亚洲精品| 免费在线观看日韩欧美| 欧美成熟视频| 欧美色欧美亚洲另类七区| 欧美日韩视频在线第一区| 国产精品a久久久久久| 国产精品一卡二卡| 国产在线一区二区三区四区| 精品999日本| 亚洲精品日本| 亚洲综合成人在线| 久久久久久久久综合| 免费一级欧美片在线播放| 亚洲高清视频中文字幕| 亚洲精品一区二区三区樱花| 一区二区三区不卡视频在线观看| 亚洲视频在线观看免费| 久久爱另类一区二区小说| 免费短视频成人日韩| 国产精品h在线观看| 国产三级欧美三级日产三级99| 在线观看亚洲精品视频| 亚洲精品一区中文| 午夜国产一区| 欧美大片在线观看一区二区| 亚洲人成人99网站| 亚洲欧美中文另类| 美玉足脚交一区二区三区图片| 欧美日韩在线观看视频| 国产亚洲亚洲| 夜夜精品视频一区二区| 久久久国产午夜精品| 亚洲国产欧美久久| 午夜精品福利一区二区三区av| 免费高清在线一区| 国产精品一二一区| 亚洲免费观看高清完整版在线观看熊 | 亚洲国产综合91精品麻豆| 亚洲欧美激情视频| 欧美黄色成人网| 亚洲欧美国产高清| 欧美夫妇交换俱乐部在线观看| 国产伦精品一区二区三| 亚洲精品在线三区| 久久久国产成人精品| 99视频超级精品| 免费欧美视频| 国产综合视频| 羞羞漫画18久久大片| 99精品久久久| 欧美成人免费一级人片100| 韩国av一区二区三区| 午夜精品免费视频| 日韩视频―中文字幕|