Arduino在Linux上的多个http请求期间挂起但在Windows上不挂起

时间:2014-03-24 09:04:28

标签: c++ linux apache networking arduino

当我从arduino发送http请求到linux mysql服务器时,我遇到了问题。它在一些请求(~150)之后随机挂起,但在Windows上它运行顺畅。

因此我认为问题不在于arduino代码,而是在其他地方。

linux服务器运行在raspberry pi(Raspbian)上。

有什么建议吗?

arduino代码HERE

 if(!getPage(server,serverPort)) Serial.print(F("Fail "));



byte getPage(IPAddress ipBuf,int thisPort)
{
  int inChar;


  Serial.print(F("connecting..."));

  if(client.connect(ipBuf,thisPort))
  {
    Serial.println(F("connected"));

    strcpy(outBuf,"GET /write3.php?value0=");
    itoa(value0,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value1=");
    itoa(dht_humidity,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value2=");
    itoa(temperature,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value3=");
    itoa(pressure,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value4=");
    itoa(altitude,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value5=");
    itoa(gust,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value6=");
    itoa(dir,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value7=");
    itoa(rain,tBuf,10);
    strcat(outBuf,tBuf);

    strcat(outBuf,"&value8=");
    itoa(knots,tBuf,10);
    strcat(outBuf,tBuf);


    client.write(outBuf);
    client.println(" HTTP/1.1");
    client.println("Host: 192.168.1.3");
    client.println("Connection: close");
    client.println();

编辑:刚刚在DEBUG ___ 3

被绞死
Serial.println("DEBUG___2");
client.write(outBuf);
Serial.println("DEBUG___3");
client.println(" HTTP/1.1");
Serial.println("DEBUG___4");
client.println("Host: 192.168.1.3");
Serial.println("DEBUG___5");
client.println("Connection: close");
client.println();

我在挂机时使用wireshark捕获了网络流量:

(大图片:hanged http request ---- successfull http request

这是挂起的http请求

enter image description here

这是一个成功的请求:

enter image description here

任何想法的家伙?仍然卡在那里!!!

1 个答案:

答案 0 :(得分:1)

假设您确定outBuf没有溢出(它小于最大可能的请求字符串大小并且您使用的是strcat(所有邪恶的来源))

服务器可能会在连接打开和实际发送任何字节之间的较长时间内超时。预构建outBuf,以便在连接打开时准备就绪。

strncat(outBuf,...,127);
... request is fully constructed

if(client.connect(ipBuf,thisPort)) {
  client.write(outBuf);
  client.println(" HTTP/1.1");
  client.println("Host: 192.168.1.3");
...

对于服务器,SYN'd但未使用的连接是要恢复的资源。 Arduino会很慢,看起来像是一个空闲的连接。此外,SYN泛洪是一种旧的拒绝服务向量,大多数服务器都会对其进行防范。

超时值的差异可以解释为什么基于Linux和Win的服务器的行为不同。您可以通过在流量上运行Wireshark来确认这一点。如果服务器在Arduino上超时,您将看到以下序列:

  • 在服务器和Arduino之间进行SYN握手
  • 一点时间过去了
  • 来自服务器的RST,表明连接已停止
  • Arduino将请求字符串发送到现在已断开的连接
  • Arduino程序在client.write()处挂起,因为连接状态不存在 同步
  • 客户端可能正在重试 - 您应该会看到一些重新传输