【问题标题】:How to receive int array from client side (written in C) to server (written in python)如何从客户端(用C编写)接收int数组到服务器(用python编写)
【发布时间】:2013-09-23 19:26:08
【问题描述】:

我只想将数组 adc_array=[w, x, y, z] 从客户端发送到服务器。下面是客户端代码,而我的服务器在 python 中,只接受 json。编译代码时没有错误,但是收到 2 个警告: 1- 警告:传递“UDPWrite”的参数 2 的指针目标的符号不同。 2- 警告:文件末尾没有换行符。

但在服务器端,我无法接收整个数组,而是只获取数组的第一个字符,即 [ 。

我是 C 编程新手。非常感谢任何帮助。

// Main function
void FlyportTask()
{
// Flyport connects to default network
WFConnect(WF_DEFAULT);
while(WFGetStat() != CONNECTED);
vTaskDelay(25);
UARTWrite(1,"Flyport Wi-fi connected...hello world!\r\n");

BOOL UdpSocketOpenRequest=TRUE;
BYTE UdpSocket=0;


// openinging UDP socket
if (UdpSocketOpenRequest) //open socket
{
    UdpSocketOpenRequest=FALSE;
    if (UdpSocket!=0) //if this is not equals to zero
    {
        UDPClientClose(UdpSocket);
    }   
    UARTWrite(1,"OpenSocket\r\n");
    UdpSocket= UDPClientOpen("10.0.0.106", "8000"); //Client socket opening 
}


while(1)
{
    //defining pointer
    int *array_pointer;
    int adc_array[4];
    int j;
    char buf[10];       //buffer to print 

    // I have made a separate function to get adc values which returns the pointer to the array.
    array_pointer = get_adcval();

    UARTWrite (1, "ADC Array\r\n");

    for (j = 0; j < 4; j++)
    {
        adc_array[j] = *(array_pointer + j);
        sprintf (buf, "%d", adc_array[j]);
        UARTWrite (1, buf);
        UARTWrite (1, "\n");
    }


    //if UDP socket is open, send the data 
    if ((UdpSocket!=0))
    {
        // defining pointer of serial_out
        char *s_out;
        int size;

        // creating a JSON array from adc_array with 4 elements
        cJSON * int_array = cJSON_CreateIntArray(adc_array,4);

        // Serializing the array
        s_out = cJSON_Print(int_array);

        //Writing to the serial output/monitor
        UARTWrite(1, "\r\narray to be sent\r\n");
        UARTWrite(1, s_out);
        UARTWrite(1,"\r\n");

                    // Assume adc_array=[1021, 1022, 1023, 1024]
                    // I get output [1021, 1022, 1023, 1024]

        //compose message
        size = strlen(s_out);
        UDPWrite (UdpSocket, s_out, size);

                    // at the server side, i just receive only first character i.e. [

        /*to free the memory */
        free(s_out);

    }



    //
    // remember to add delay vTaskDelay(50) 50ms
    //remember to close the socket


}


}

【问题讨论】:

    标签: c arrays json udpclient


    【解决方案1】:

    您没有为 s_out 分配内存。即使它在 UART 上打印正确的结果,但它仍然可以被下一行中的任何 UARTWrite 函数或 strlen() 函数覆盖。如果它被覆盖,那么“size”变量将获取内存中从第一个字节到第一个空字符的字节数(这就是 strlen() 的作用方式)。因此“大小”值可以是完全随机的。它可以是 0 或 1 或 1000。如果大小不正确,那么您将只收到“大小”字节数。在您的情况下,大小可能是 1。尝试在 UDPWrite 之前打印大小。通过在序列化数组之前添加 malloc 调用来解决此问题。

    如果它也不起作用,请检查您的接收方。如果您从经过测试的 python 客户端(或任何其他经过测试或可靠的客户端)发送一些虚拟数据,您的接收器工作正常吗?如果不是,那么您的接收器有问题。

    【讨论】:

      【解决方案2】:

      打印出 strlen(s_out) 返回的内容,还打印出 UDPWrite 的返回值(我假设像任何写入函数一样,这将返回写入套接字的数据的大小)。

      通过阅读函数名称,我认为您使用的是不可靠的 UDP 传输。

      【讨论】:

        猜你喜欢
        • 2013-08-17
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2011-04-30
        • 1970-01-01
        • 2017-08-10
        • 2018-07-01
        相关资源
        最近更新 更多