C-尝试发送()数据,但存在错误

C-尝试发送()数据,但存在错误,c,send,C,Send,我正在尝试使用GET请求从文件中逐行发送数据(新行已删除)。问题是,当我检查我的apache访问日志时,即使我对请求进行url编码(也是2x编码),也不会发送带有行的请求,其中三个单词由空格分隔 文本文件示例: asd asd asd asd asd asd <- not sent 请求应该有效,因为我尝试使用其他脚本复制请求 所以我发现了一些 当您发送a时,a将执行请求,但之后不会发送另一行。但我仍然不认为这是Web服务器或无效头的问题,因为例如在Burpuite中,我可以发送这些

我正在尝试使用
GET
请求从文件中逐行发送数据(新行已删除)。问题是,当我检查我的apache访问日志时,即使我对请求进行url编码(也是2x编码),也不会发送带有行的请求,其中三个单词由空格分隔

文本文件示例:

asd

asd asd

asd asd asd <- not sent
请求应该有效,因为我尝试使用其他脚本复制请求

所以我发现了一些

当您发送
a时,a
将执行请求,但之后不会发送另一行。但我仍然不认为这是Web服务器或无效头的问题,因为例如在Burpuite中,我可以发送这些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);
    }
  }
socket\u handle=socket(AF\u INET,SOCK\u STREAM,0);
插座\u detials.sin\u family=AF\u INET;
socket_detials.sin_addr.s_addr=inet_addr(主机);
插座尺寸sin端口=htons(80);
输入缓冲区=malloc(20000);
线号=0;
而(fgets(行缓冲区、大小缓冲区、填充)){
++线号;
strtok(行缓冲区“\n”);
printf(“\n\n%s\n\n”,行\u缓冲区);
asprintf和httpget,
“获取/%s HTTP/1.1\r\n”
“主机:127.0.0.1\r\n”
“用户代理:\r\n”
接受:text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png;q=0.5\r\n
接受语言:en-us,en;q=0.5\r\n
接受编码:gzip,解压缩\r\n
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n
“缓存控制:最大年龄=\r\n”
“\r\n”,行\u缓冲区);
bzero(&(插座详情),8);
连接(套接字句柄,(结构sockaddr*)和套接字细节,大小(结构sockaddr));
如果(发送(套接字句柄,httpget,strlen(httpget),0)<0){
printf(“\n\n\n ERROR send()\n\n\n”);
}
int received=recv(套接字句柄,输入缓冲区,20000,0);
如果(收到!=0){
printf(“\r接收%d字节|发出的请求:%d”,已接收,请求++);
printf(“\n%s\n”,httpget);
printf(“%s%s\n%s\n”,灰色,输入缓冲区,正常);
}否则{
printf(“\r接收%d字节|发出的请求:%d”,已接收,请求++);
printf(“\n%s请求未发送。%s\n\n响应:\n\n”,红色,正常);
printf(“\n%s\n”,httpget);
printf(“%s%s\n%s\n”,灰色,输入缓冲区,正常);
}
}

为什么在可能无效的请求之后会关闭套接字?

您应该在HTTP RFC中查找URL编码。空格需要编码为“%20”,但还有许多其他字符也需要编码。与将文本文件发布到服务器相比,这看起来效率极低。

我知道它应该是url编码的,但为什么它使用其他程序工作?我正在尝试模糊Web服务器。我不想向服务器发送任何文件:)您是否有可能使用非阻塞套接字发送数据?您的具体想法是什么?:)您的真实代码是否检查
send()
返回的内容?仅使用if(send(socket\u handle,httpget,strlen(httpget),0)<0)那么,您使用哪种套接字:阻塞还是非阻塞。您可能希望显示用于创建它的代码,如果确实使用了
setsockopt()
对后者的所有调用。
  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);
    }
  }