我試圖從文件使用GET
請求(換行符刪除)逐行發送數據。問題是當我檢查我的apache訪問日誌時,請求與行在哪裏三個單詞由空格分隔在一起,即使我網址編碼它也不會發送(也是2x編碼)。文本文件的C - 試圖發送()數據,但有錯誤
例子:
asd
asd asd
asd asd asd <- not sent
代碼:
asprintf(&httpget,
"GET /%s HTTP/1.1\r\n"
"Host: 127.0.0.1\r\n"
"User-Agent: \r\n"
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,;q=0.5\r\n"
"Accept-Language: en-us,en;q=0.5\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
"Cache-Control: max-age=\r\n"
"\r\n", line_buffer);
send(socket_handle, httpget, strlen(httpget), 0);
請求應該是有效的,因爲我嘗試使用其他腳本複製請求。
所以,我發現了一些東西......
當您發送a a
它會做的請求,但之後另一條線不被髮送。但我仍然不認爲這就是網絡服務器或無效的頭,造成例如在BurpSuite的問題,我可以把這些URL未編碼的數據沒有任何問題和日誌的模樣
127.0.0.1 - - [22/Nov/2014:13:37:04 +0100] "GET /test test test HTTP/1.1" 200 54
完整代碼:
socket_handle = socket(AF_INET, SOCK_STREAM, 0) ;
socket_detials.sin_family = AF_INET ;
socket_detials.sin_addr.s_addr = inet_addr(host);
socket_detials.sin_port = htons(80);
input_buffer = malloc(20000);
line_number = 0;
while (fgets(line_buffer, sizeof(line_buffer), infile)) {
++line_number;
strtok(line_buffer, "\n");
printf("\n\n%s\n\n", line_buffer);
asprintf(&httpget,
"GET /%s HTTP/1.1\r\n"
"Host: 127.0.0.1\r\n"
"User-Agent: \r\n"
"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,;q=0.5\r\n"
"Accept-Language: en-us,en;q=0.5\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
"Cache-Control: max-age=\r\n"
"\r\n", line_buffer);
bzero(&(socket_detials.sin_zero), 8);
connect(socket_handle,(struct sockaddr*)&socket_detials, sizeof(struct sockaddr));
if(send(socket_handle, httpget, strlen(httpget), 0) < 0) {
printf("\n\n\n ERROR send() \n\n\n");
}
int recieved = recv(socket_handle, input_buffer, 20000, 0);
if(recieved != 0) {
printf ("\rRecieved %d bytes | Requests made: %d ", recieved, req++);
printf("\n%s\n", httpget);
printf("%s%s\n%s\n", gray, input_buffer, normal);
} else {
printf ("\rRecieved %d bytes | Requests made: %d ", recieved, req++);
printf("\n%sRequest not sent.%s \n\nResponse:\n\n", red, normal);
printf("\n%s\n", httpget);
printf("%s%s\n%s\n", gray, input_buffer, normal);
}
}
爲什麼在可能無效的請求後套接字關閉?
你是否有機會使用非阻塞套接字發送數據? – alk 2014-11-22 12:57:39
你到底在想什麼? :) – picker 2014-11-22 12:58:46
你真的代碼檢查'send()'返回什麼嗎? – alk 2014-11-22 13:02:13