- 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
}