ESP8266 SMING TCP sendString() 和 writeString() 的区别

Difference between ESP8266 SMING TCP sendString() and writeString()

我正在使用 ESP8266 和 SMING framework

我在 Telnet_TCPServer_TCPClient example 中找到了这个示例代码。

bool tcpServerClientReceive (TcpClient& client, char *data, int size)
{
   debugf("Application DataCallback : %s, %d bytes \r\n", client.getRemoteIp().toString().c_str(),size );
   debugf("Data : %s", data);
   client.sendString("sendString data\r\n", false);
   client.writeString("writeString data\r\n",0 );
   if (strcmp(data,"close") == 0)
   {
      debugf("Closing client");
      client.close();
   };
   return true;
}

这个示例代码中sendString()writeString()有什么区别?好像没什么区别。结果是将字符串数据发送到另一方 TCP。

示例中使用的客户端对象是 TcpClient 的一个实例,后者又是 TcpConnection 对象的派生 class。 TcpClient 确实有一个 .sendString method and the .writeString 方法是 class TcpConnection 的一个方法(TcpClient 的父 class)

其实.writeString

有两个重载方法

所以,有了所有这些信息,基本上 .sendString 会这样做(在该方法中它调用 .send 方法):

if (state != eTCS_Connecting && state != eTCS_Connected) return false;

if (stream == NULL)
    stream = new MemoryDataStream();

stream->write((const uint8_t*)data, len);
asyncTotalLen += len;
asyncCloseAfterSent = forceCloseAfterSent;

return true;

.write 方法执行此操作:

   u16_t available = getAvailableWriteSize();
   if (available < len)
   {
       if (available == 0)
           return -1; // No memory
       else
           len = available;
   }

   WDT.alive();
   err_t err = tcp_write(tcp, data, len, apiflags);

   if (err == ERR_OK)
   {
        //debugf("TCP connection send: %d (%d)", len, original);
        return len;
   } else {
        //debugf("TCP connection failed with err %d (\"%s\")", err, lwip_strerr(err));
        return -1;
   }

所以从外观上看,一个是异步的 (.sendString),另一个不是 (.writeString)。