Tiếp theo, ta viết hàm xử lý 1 request nhận được Lúc này, request nhận được qua port TCP80 đang nằm trên buffer, ngay sau TCP Header Nhiệm vụ của hàm này là xác định phương thức

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 137 - 139)

- Như chúng ta biết bảng ARP cache được cập nhật là có 2 trường hợp 1 là gởi bản tin ARP request, 2 mỗi khi có gói tin IP đến thì nó sẽ cập nhật IP và MAC của thằng máy tính đã gởi đị

Tiếp theo, ta viết hàm xử lý 1 request nhận được Lúc này, request nhận được qua port TCP80 đang nằm trên buffer, ngay sau TCP Header Nhiệm vụ của hàm này là xác định phương thức

đang nằm trên buffer, ngay sau TCP Header. Nhiệm vụ của hàm này là xác định phương thức (method) của request, xác định vị trí các field, và lưu nhưng thông tin này vào struct httpRequest tương ứng.

Code:

//--- //Ham xu ly mot request cua giao thuc HTTP

void httpGetRequest(unsigned char *buffer,unsigned int bufferLen,struct httpRequest* rqst)

unsigned int i;

if((buffer[0] == 'G')&&(buffer[1] == 'É)&&(buffer[2] == 'T')){ rqst->method = HTTP_REQUEST_GET;

#ifdef HTTP_DEBUG printf("GET\r\n"); #endif

}else if((buffer[0] == 'P')&&(buffer[1] == 'Ó)&&(buffer[2] == 'S')&&(buffer[3] == 'T')){

rqst->method = HTTP_REQUEST_POST; #ifdef HTTP_DEBUG

printf("POST\r\n"); #endif

}else if((buffer[0] == 'H')&&(buffer[1] == 'É)&&(buffer[2] == 'Á)&&(buffer[3] == 'D')){ rqst->method = HTTP_REQUEST_HEAD; #ifdef HTTP_DEBUG printf("HEAD\r\n"); #endif }else{ rqst->method = HTTP_REQUEST_UNKNOWN; #ifdef HTTP_DEBUG printf("UNKNOWN\r\n"); #endif }

//Bat dau tim URI va HTTP version i = 0;

while(++i<bufferLen){

if(buffer[i] == ' '){ //khoang trang dau tien rqst->requestURI = &buffer[i+1];

break; }

}

while(++i<bufferLen){

if(buffer[i] == ' '){ //khoang trang dau tien rqst->version = &buffer[i+1]; break; } } //Tim header while(++i<bufferLen){

if((buffer[i] == 0x0d) && (buffer[i+1] == 0x0a)){ //\n\r dau tien, bat dau header

rqst->header = &buffer[i+2]; break;

} }

//Tim ket thuc header while(++i<bufferLen){

if((buffer[i] == 0x0d) && (buffer[i+1] == 0x0a) && (buffer[i+2] == 0x0d)){ //\n\r\n\r i += 4; break; } } rqst->body = &buffer[i]; rqst->bodyLen = bufferLen - i;

#ifdef HTTP_DEBUG

printf("Buffer Len:%d\r\n",bufferLen);

printf("URI start:%d\r\n",(rqst->requestURI - buffer)); printf("HTTP Version:%d\r\n",(rqst->version - buffer)); printf("Header:%d\n\r",(rqst->header - buffer));

printf("Body:%d\n\r",(unsigned int)(rqst->body - buffer)); printf("Body:%x-%x\n\r",(unsigned int)(rqst->body),(unsigned int)buffer);

printf("Body i:%d\n\r",i); #endif

}

Một phần của tài liệu ATMEGA32 GIAO TIẾP VỚI ENC28J60 QUA SPI – AVR WEBSERVER (Trang 137 - 139)

Tải bản đầy đủ (DOCX)

(150 trang)
w