使用C

时间:2015-06-04 00:48:40

标签: c httprequest

我正在尝试捕获HTTP请求并使用C将其存储在数组中。我怎么可能这样做?

我得到的请求是以下形式:

POST /box/update HTTP/1.1
Accept : application/json
Content-Type : application/x-www-form-urlencoded
host:121.158.41.104:1338
content-length : 83
Connection : close

serial=1234&pin=1234&poweState=true&startState=true&temperature=11&macAdress=113

到目前为止,我已尝试过代码:

/*
  WiFi Web Server
 A simple web server that shows the value of the analog input pins.
 using a WiFi shield.
 This example is written for a network using WPA encryption. For
 WEP or WPA, change the Wifi.begin() call accordingly.
 Circuit:
 * WiFi shield attached
 * Analog inputs attached to pins A0 through A5 (optional)
 created 13 July 2010
 by dlf (Metodo2 srl)
 modified 31 May 2012
 by Tom Igoe
 */
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>

// your network name also called SSID
char ssid[] = "MySSID";
// your network password
char password[] = "MyPassword";
// your network key Index number (needed only for WEP)
int keyIndex = 0;
WiFiServer server(Mport);
int array_number = 3;
void setup() {
  Serial.begin(115200);      // initialize serial communication
  pinMode(RED_LED, OUTPUT);      // set the LED pin mode
  // attempt to connect to Wifi network:
  Serial.print("Attempting to connect to Network named: ");
  // print the network name (SSID);
  Serial.println(ssid); 
  // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
  WiFi.begin(ssid, password);
  while ( WiFi.status() != WL_CONNECTED) {
    // print dots while we wait to connect
    Serial.print(".");
    delay(300);
  }

  Serial.println("\nYou're connected to the network");
  Serial.println("Waiting for an ip address");

  while (WiFi.localIP() == INADDR_NONE) {
    // print dots while we wait for an ip addresss
    Serial.print(".");
    delay(300);
  }
  // you're connected now, so print out the status  
  printWifiStatus();

  Serial.println("Starting webserver on port 80");
  server.begin();                           // start the web server on port 80
  Serial.println("Webserver started!");
}

void loop() {
  // listen for incoming clients
  WiFiClient client = server.available();
  String buffer = "";
  String post_str1 = ""; 

  /*
  int temperatures;
  String macAddresses;
  */

  String status_message;
  int status_code;
  boolean powerStates[3]= {true,true,true};
  boolean startStates[3]= {true,true,true};
  //int temperatures[3]={11,22,33};
  char * macAddresses[3] = {"155","156","157"};
  char *  temperatures[3] = {"11","22","33"};
  // powerStates[3] 
  //startStates[3] 
  /*
  temperatures = 11;
  macAddresses = "155";
  */
  status_code = 1;
  status_message = "success";

  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    int check = 0;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        buffer +=c;
        Serial.write(c);

        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
       //if(c == '\n' && currentLineIsBlank){
       if(buffer.indexOf("true")>=0||buffer.indexOf("false")>=0){

          // you're starting a new line

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: application/json");
          client.println();

          client.print("{\"serial\":\"");
          client.print("1234");
          client.print("\",\"pin\":\"");
          client.print("1234");

          client.print("\",\"powerStates\":");
          client.print("[1,1,1]");
          client.print(",\"startStates\":");
          client.print("[1,1,1]");
          client.print(",\"temperatures\":");
          client.print("[11,22,33]");
          client.print(",\"macAddresses\":");
          client.print("[\"125\",\"136\",\"137\"]");

/*
          client.print("\",\"powerStates\":");
          client.print("[\"true\",\"true\",\"true\"]");
          client.print(",\"startStates\":");
          client.print("[\"false\",\"false\",\"false\"]");
          client.print(",\"temperatures\":");
          client.print("[\"11\",\"22\",\"33\"]");
          client.print(",\"macAddresses\":");
          client.print("[\"155\",\"156\",\"157\"]");
*/
          client.print(",\"status_code\":");
          client.print(status_code);
          client.print(",\"status_message\":\"");
          client.print(status_message);
          client.print("\"}"); 


          Serial.print("\n\r");

          Serial.print("{\"serial\":\"");
          Serial.print("1234");
          Serial.print("\",\"pin\":\"");
          Serial.print("1234");

          Serial.print("\",\"powerStates\":");
          Serial.print("[\"true\",\"true\",\"true\"]");
          Serial.print(",\"startStates\":");
          Serial.print("[\"true\",\"true\",\"true\"]");
          Serial.print(",\"temperatures\":");
          Serial.print("[\"11\",\"22\",\"33\"]");
          Serial.print(",\"macAddresses\":");
          Serial.print("[\"155\",\"156\",\"157\"]");

          Serial.print(",\"status_code\":");
          Serial.print(status_code);
          Serial.print(",\"status_message\":\"");
          Serial.print(status_message);
          Serial.print("\"}"); 

          Serial.print("\n\r");

          buffer="";
          check==0;
          break;
          }
          if(c == '\n'){
            currentLineIsBlank=true;
           }
          else if (c !='\r'){
            currentLineIsBlank=false;
          }


      }// carrage
      }//client avable
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");

  }//if client
}//while

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("Network Name: ");
  Serial.println(WiFi.SSID());
  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
} 

我的程序需要存储每个变量和值以供进一步使用。我已经能够在我的控制台上读取此请求和输出,但更进一步,我被卡住了。

1 个答案:

答案 0 :(得分:1)

我不知道你尝试了什么,因为我正在使用Stack Overflow for Android(buggy)而且我看不到你的整个代码缓冲区

请在下次代码中具体说明

如果你想存储缓冲区,你会得到一个数组(请求)
我能想到的最好方法是使用2D指针进行动态内存分配。

您可以从该代码开始

#include <stdio.h>
#include <stdlib.h>
#define MAX_BUF 1024
char* arrOfBuffers[1000]; // stored requests 
int requests = 0; // number of http requests stored
const char* getHttp(const char* URL)
{
    char* buf;
    // Some http GET functions
    // send(socket, "GET / HTTP/1.0", ...);
    // ...
    // memset(buf 0, MAX_BUF)
    // ...
    // recv(socket, buf, sizeof(buf), ...);
    // ...
    // Save it
    buf = "some buffer"; // example
    arrOfBuffers[requests] = buf;
    puts(arrOfBuffers[requests]);
    ++requests;
    return buf;
}
int main ()
{
    for(int i = 0; i <= 1000; ++i) // 1000 requests
    {
        char* request = (char*)calloc(1, 80);
        sprintf(request, "http://www.stackoverflow.com/users/%d/", i);
        getHttp(request);
    }
    return 0;
}

我真的想要为我的代码制作一个真实的实例,但我现在不能使用套接字库因为我是PC afk。