This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C1294NCPDT:连续数据传输到 HTTP 服务器

Guru**** 2577385 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/765064/ccs-tm4c1294ncpdt-continuous-data-transfer-to-http-server

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

我正在尝试使用 enet_lwip 示例将数据连续发送到 http 服务器。 我有 http 客户端、但在发送第一个传输后、客户端本身会关闭连接。 我正在创建 http POST 请求,然后在 main 的 while 循环中调用 tcp_send_packet()。 它接收回调并在第一次传输后关闭连接。

ERR_t tcpRecvCallback (void *arg、struct tcp_pcb、struct pbuf *p、err_t err)

UARTprintf ("接收到的数据。\n");
if (p = NULL){
UARTprintf ("远程主机关闭了连接。\n");
UARTprintf ("正在关闭连接。\n");
tcp_close (testpcb);
返回 ERR_ABRT;

其他

UARTprintf (" pbufs %d\n"、pbuf_clen (p)的数量);
UARTprintf (" pbuf %s\n"的内容、(char *) p->payload);

返回0;

我用不同的方式尝试了它。 如果我将 tcp_setup 函数与 POST 请求和 tcp_send_packet()一起放入一段时间,则它将通过提供错误代码:-13来工作。 是否有人能建议我使用正确的方法从 http 客户端将数据连续发送到 http 服务器。

谢谢

此致

B S Sai Prasad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    您可以随附代码吗? 您只是显示了一个回调函数。 您在 tcp_setup 和 tcp_send_packet 中执行了什么操作?

    BTW、enet_lwip 是 Web 服务器应用程序、而不是客户端应用程序。 我假设您对它进行了修改。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我将共享该代码。 请仔细检查、并建议我采用最佳方式连续发送数据。 我正在 调用 lwIPHostTimerHandler (void)中的 tcp_setup()函数。

    //
    //
    //写入要发送到远程主机的数据...
    //
    //
    uint32_t tcp_send_packet (void)

    DATA_SEND = false;

    ERR = tcp_write (testpcb、XmlRequest、strlen (XmlRequest)、tcp_write_flag_copy);

    如果(错误)

    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_write)\n"、错误);
    返回1;

    /*现在发送*/
    ERR = tcp_output (testpcb);

    如果(错误)

    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_output)\n"、错误);
    返回1;

    DATA_SEND = true;

    返回0;

    void Create_post_req()

    sprintf (请求、"/%s HTTP/1.1"、ServiceMethod);

    sprintf (XmlRequest、"发布%s\r\n 主机:%s:%s\r\n 内容类型:application/xml\r\n 高速缓存控制:无高速缓存\r\n 内容长度:%d\r\n%s\r\n 请求、hosttip、port、strlen (XmlData);

    UARTprintf ("\n\nPOST 请求发送到服务器:\n\n");
    UARTprintf ("%s"、XmlRequest);

    tcp_send_packet();


    //
    //
    //初始化回调
    //
    //用于指定 TCP 连接接收数据时应调用的函数。
    //数据已成功传送到远程主机。
    //
    //
    ERR_t connectCallback (void *arg、struct tcp_PCB *testpcb、err_t err)

    如果(err =ERR_OK)

    UARTprintf ("连接已建立。\n");

    tcp_recv (testpcb、tcpRecvCallback);
    tcp_sent (testpcb、NULL);

    UARTprintf ("向服务器发送数据\n");

    //tcp_send_packet();


    DATA_SEND = true;

    返回0;

    其他

    UARTprintf ("未建立连接。\n");
    返回1;

    //
    //
    //初始化以太网客户端
    //
    //此函数将所有以太网组件初始化为未配置。
    //
    //\返回无。
    //
    //
    void tcp_setup (void)

    /*创建 IP */
    struct ip_addr server_addr;


    /*创建控制块*/
    //testpcb 是一个全局结构 tcp_pcb

    testpcb = tcp_new();

    if (testpcb!=空)

    IP4_ADDR (&server_addr、89、221、247、3);服务器的/IP

    ERR = tcp_bind (testpcb、IP_ADDR_ANY、9009);//将连接绑定到本地端口号和 IP 地址

    如果(错误)

    UARTprintf ("错误:代码:%d (tcp_connect)\n"、错误);

    /*现在连接*/
    ERR = tcp_connect (testpcb、&server_addr、8089、connectCallback);//连接到另一台主机。

    如果(错误)

    UARTprintf ("错误:代码:%d (tcp_connect)\n"、错误);

    UARTprintf ("PCB created \n");


    其他

    memp_free (MEMP_tcp_PCB、testpcb);
    UARTprintf ("PCB 未创建\n");

    MAIN ()

    三、会议的报告

    三、会议的报告

    while (1)

    if (data_send = true)

    create_post_req();

    //tcp_write (testpcb、XmlRequest、strlen (XmlRequest)、tcp_write_flag_copy);

    // tcp_output (testpcb);

    SysCtlDelay (g_ui32SysClock / 10 / 3);

    //tcp_setup();

    谢谢

    此致

    B S Sai Prasad。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     这是一个客户端示例、它回传从服务器接收到的内容。 您能看一下吗?

    #include 
    #include 
    #include 
    #include 
    include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/flash.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"
    #include "driverlib/rom_map.h"
    #include "drivers/exctrintrune.h"
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #include "drivers/out_out_out_out_utils/ld/ldise"#include "texpintrintrinh #include "out.h #include "out_unic.h"
    
    
    ERR_t ECHO_POLL (void *arg、struct tcp_pcb);
    void ECHO_ERROR (void *arg、ERR_t err);
    err_t ECHO_SENT (void *arg、 struct tcp_pcb * tpcb、u16_t len);
    err_t err;
    
    uint32_t tcp_send_packet (void);
    
    static struct tcp_pcb * testpcb;//pcb 全局
    
    
    #define SYSTICKHZ 100
    #define SYSTICKMS (1000/SYSTICKHZ)
    
    #define SysTK_INT_PRIORITY 0x80
    #define ETHERNET_INT_PRIORITY 0xC0
    
    uINT32_t g_ui32IPAddress;
    
    uINT32_t g_ui32ool 时钟;
    易失性 bg_bled;
    bIPAddrValid = 0;
    
    
    
    //****Sys*
    //驱动程序库遇到错误时调用的错误例程。
    //
    #ifdef debug
    void
    __error__(char *pcFilename、uint32_t ui32Line)
    {
    
    #endif
    
    
    void
    DisplayIPAddress (uint32_t ui32Addr)
    {
    char pcBuf[16];
    //将 IP 地址转换为字符串。
    usprintf (pcBuf、"%d.%d.%d.%d"、ui32Addr & 0xff、(ui32Addr >> 8)& 0xff、
    (ui32Addr >> 16)& 0xff、(ui32Addr >> 24)& 0xff);
    UARTprintf (pcBuf);
    }
    
    //*************
    // lwIP 库支持任何与主机相关的计时器函数所需的。
    //
    void
    lwIPHostTimerHandler (void)
    {
    uint32_t ui32NewIPAddress;
    
    ui32NewIPAddress = lwIPLocalIPAddrGet ();//获取当前 IP 地址。
    
    if (ui32NewIPAddress!= g_ui32IPAddress)//查看 IP 地址是否已更改。
    {
    if (ui32NewIPAddress == 0xffffffff)
    {
    UARTprintf ("正在等待链接。\n");
    }
    否则、如果(ui32NewIPAddress =0)
    {
    UARTprintf ("正在等待 IP 地址。\n");
    }
    其他
    {
    G_bIPAddrValid = 1;
    UARTprintf ("IP 地址:");
    DisplayIPAddress (ui32NewIPAddress);
    UARTprintf ("\n\n");
    }
    G_ui32IPAddress = ui32NewIPAddress;
    }
    
    if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
    {
    //
    //不执行任何操作并继续等待。
    //
    }
    }
    
    //*********
    // SysTick 中断的中断处理程序。
    //
    void
    SysTickIntHandler (void)
    {
    lwIPTimer (SYSTICKMS);
    
    G_bled = true;
    }
    
    
    //*********
    char MyData[1024];
    
    err_t echo_receive (void * arg、struct tcp_pcb、struct pbuf * p、err_t err)
    {
    int len;
    char *header="客户机:";
    int header_len = strlen (标头);
    
    UARTprintf ("接收到的数据。\n");
    if (p = NULL){
    UARTprintf ("远程主机关闭了连接。\n");
    tcp_close (tpcb);
    返回 ERR_ABRT;
    } 否则{
    tcp_recved (tpcb、p->t_t_len);
    
    //支付负荷的大小
    len = p->t_t_len + header_len;
    
    strcpy (MyData、标头);
    strcat (MyData、(char *) p->payload);
    
    
    //释放数据包缓冲区
    pbuf_free (p);
    
    //检查输出缓冲器容量
    如果(len > tcp_sndbuf (tpcb))
    len= tcp_sndbuf (tpcb);
    
    //将数据排队发送出去
    //err = tcp_write (tpcb、MyData、len、0);
    ERR = tcp_write (tpcb、MyData、len、0);
    如果(err =ERR_OK){
    UARTprintf ("回送数据");
    }
    否则、如果(err =ERR_MEM)
    {
    //内存不足,请稍后再试,推迟轮询*/
    UARTprintf ("内存不足。\n");
    
    } 其他
    {
    /*需要注意的其他问题*/
    UARTprintf ("其他问题。\n");
    }
    tcp_sent (tpcb、NULL);//无需回拨*/
    }
    
    
    返回 ERR_OK;
    }
    
    uint32_t tcp_send_packet (void)
    {
    char *字符串="Hello World! \n\n";
    
    ERR = tcp_write (testpcb、string、strlen (string)、tcp_write_flag_copy);
    
    
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_write)\n"、错误);
    返回1;
    }
    
    /*现在发送*/
    ERR = tcp_output (testpcb);
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_output)\n"、错误);
    返回1;
    }
    返回0;
    }
    
    ERR_t connectCallback (void *arg、struct tcp_pcb、err_t err)
    {
    
    
    if (err =ERR_OK){
    
    UARTprintf ("连接已建立。\n");
    
    
    tcp_recv (testpcb、eco_receive);
    tcp_sent (testpcb、NULL);
    UARTprintf ("向服务器发送问候消息\n");
    tcp_send_packet();
    返回0;
    } 否则{
    UARTprintf ("未建立连接。\n");
    返回1;
    
    }
    }
    
    void echo_client_init (void)
    {
    /*创建 IP */
    struct ip_addr server_addr;
    
    
    /*创建控制块*/
    testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb
    
    if (testpcb!=空)
    {
    IP4_ADDR (&server_addr、10、219、15、38);PC 计算机 TCP/IP
    
    tcp_bind (testpcb、IP_ADDR_ANY、7000);
    
    //现在连接*/
    err = tcp_connect (testpcb、&server_addr、8000、connectCallback);
    如果(err){
    UARTprintf ("错误:代码:%d (tcp_connect)\n"、错误);
    }
    
    UARTprintf ("PCB created \n");
    
    } 否则{
    memp_free (MEMP_tcp_PCB、testpcb);
    UARTprintf ("PCB 未创建\n");
    
    }
    
    }
    
    
    int
    main (void)
    {
    uint32_t ui32User0、ui32User1;
    uint8_t pui8MACArray[8];
    
    
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
    
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    PinoutSet (true、false);
    
    UARTStdioConfig (0、115200、g_ui32SysClock);
    
    
    UARTprintf ("\033[2J\033[H");
    UARTprintf ("以太网 lwIP TCP echo 客户端示例\n"\});
    
    MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
    
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
    
    MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
    map_SysTickEnable();
    map_SysTickIntEnable();
    
    map_FlashUserGet (&ui32User0、&ui32User1);
    if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
    {
    UARTprintf ("未对 MAC 进行编程!\n");
    while (1)
    {
    }
    }
    
    UARTprintf ("正在等待 IP.\n");
    
    pui8MACArray[0]=((ui32User0 >> 0)& 0xff);
    pui8MACArray[1]=((ui32User0 >> 8)& 0xff);
    pui8MACArray[2]=((ui32User0 >> 16)& 0xff);
    pui8MACArray[3]=((ui32User1 >> 0)& 0xff);
    pui8MACArray[4]=((ui32User1 >> 8)& 0xff);
    pui8MACArray[5]=((ui32User1 >> 16)& 0xff);
    
    lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);
    
    
    while (g_bIPAddrValid ==0);
    
    
    ECHO_CLIENT_INIT();
    
    
    MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
    MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
    
    
    
    //
    //循环永久、处理 LED 闪烁。 所有工作都在中完成
    //中断处理程序。
    while (1)
    {
    
    while (g_bled == false)
    {
    }
    
    //
    //清除标志。
    //
    G_bled = false;
    
    //
    //切换 LED。
    //
    MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
    (MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
    GPIO_PIN_1);
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    相同的连接关闭方案也会与给定的输入重复出现。 在我们的情况 下、HTTP 客户端将获取连续数据、并将其连续传输到 HTTP 服务器、服务器将为每次数据传输发送200 ok 响应。 我第一次看到它在数据终止后发送数据。 我通过将一个断点置于 echo _elect()来观察该流。

    在第一个调用中,它正在验证 ECHO_Receive()中的'p =NULL。 它涉及到 tcp_event_RECV (PCB、recv_data、ERR_OK、err);该文件位于 tcp_in.c 文件中并将数据发送到 HTTP 服务器。

    在第二个调用中,它正在验证 ECHO_Receive()中的'p =NULL。 它涉及 到 tcp_event_RECV (PCB、recv_data、ERR_OK、err);它位于 tcp_in.c 文件中、但不向服务器发送数据。

    在第三个调用中,它正在验证 ECHO_Receive()中的'p =NULL。 它涉及 tcp_event_closed (PCB、err); 该文件位于 tcp_in.c 文件中、用于关闭 连接。

    在第四个调用中,正在生成 tcp_write()错误。

       

    我无法理解为什么它在第三次之后中止连接并在第一次调用中发送数据。 您能否向我解释如何控制 HTTP 客户端和 HTTP 服务器之间持续传输的流?

    谢谢

    此致

    B S Sai Prasad。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    此问题是否已解决? 您是否能够取得一些进展、并且希望您能够自行解决、因为我无法弄清真正的问题。 我还建议您向 LwIP 支持团队寻求有关这方面的建议、因为他们是 LwIP 堆栈的专家。 我现在要关闭这个线程。 如果您有新问题、您可以打开新主题。 如果您稍后对此帖子有一些更新、您只需通过发布评论来重新打开此主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    是的、我自己对其进行了修正。 我发现  请求格式有问题。 它在请求结束时是一个简单的\r\n。 我不知道如何终止连接(\r\n)? 在删除后、它工作正常。 如果您知道答案、请告诉我。

    谢谢、

    此致

    B S Sai Prasad。