C 以太网传输时端点的变化

C 以太网传输时端点的变化,c,vivado,zynq,C,Vivado,Zynq,我与zedboard和vivado v2017.3合作。我试图在下面的程序中发送由baseaddr_p指向的寄存器(Zynq的PL部分中的slv_reg0)中存储的数据 我使用lwip echo服务器应用程序读取此地址,并通过以太网将其发送到PC 这部分代码是在接收回显请求(telnet)时执行的。在这部分代码中,我还打印了gtkterm中的读取值,以便验证接收到的数据 void process_echo_request(void *p) { int sd = (int)p; i

我与zedboard和vivado v2017.3合作。我试图在下面的程序中发送由baseaddr_p指向的寄存器(Zynq的PL部分中的slv_reg0)中存储的数据

我使用lwip echo服务器应用程序读取此地址,并通过以太网将其发送到PC

这部分代码是在接收回显请求(telnet)时执行的。在这部分代码中,我还打印了gtkterm中的读取值,以便验证接收到的数据

void process_echo_request(void *p)
{
    int sd = (int)p;
    int RECV_BUF_SIZE = 2048;
    char recv_buf[RECV_BUF_SIZE];
    int n,i,nwrote;
    unsigned long my_buffer[10];
    i=0;
    init_platform();
    while(1){
    while(i<11)
    {
    Xuint32 *baseaddr_p = (Xuint32 *)XPAR_MYIP_0_S00_AXI_BASEADDR;
    my_buffer[i] = *(baseaddr_p);
    xil_printf("0x%08x \n\r", my_buffer[i]);
    i++;}
    //xil_printf("0x%08x \n\r", my_buffer);
     /* handle request */
    if ((nwrote = write(sd, my_buffer, sizeof (my_buffer))) < 0) {
        xil_printf("%s: ERROR responding to client echo request. received = %d, written = %d\r\n",
                __FUNCTION__, n, nwrote);
        xil_printf("Closing socket %d\r\n", sd);
     break;

    }

    while (1) {
        /* read a max of RECV_BUF_SIZE bytes from socket */
        if ((n = read(sd, recv_buf, RECV_BUF_SIZE)) < 0) {
            xil_printf("%s: error reading from socket %d, closing socket\r\n", __FUNCTION__, sd);
            break;
        }

        /* break if the recved message = "quit" */
        if (!strncmp(recv_buf, "quit", 4))
            break;

        /* break if client closed connection */
        if (n <= 0)
            break;


        }
    }

    /* close connection */
    close(sd);
    vTaskDelete(NULL);
    cleanup_platform();
}
void进程请求(void*p)
{
int-sd=(int)p;
int RECV_BUF_SIZE=2048;
char recv_buf[recv_buf_SIZE];
int n,i,nwrite;
无符号长my_缓冲区[10];
i=0;
init_平台();
而(1){
而(i问题在于。当您发送和接收数据时,最好进行主机到网络的转换,反之亦然

有两个POSIXAPI来进行字节顺序转换:和


在接收端,尝试进行网络到主机的字节顺序转换,如果您有权访问发送方,则在发送方执行相反的操作。

您的源计算机对整数使用小端内部表示。其
xil_printf()
函数解释了这一点,以规范的方式格式化数字以供人类使用。字节交换就在那里,而且是良性的

另一方面,
write()
不知道或不关心您传递给它的数据的重要性。它将所有内容简单地视为一个字节序列,并按照它们出现的顺序进行传输。
read()
函数按字节通过线路的顺序接收和存储字节。不会发生字节交换

如果您可以依靠接收数据的机器根据相同的数字格式(大小、字节顺序等)解释数据如果没有问题,那么您需要将数据转换为标准格式,以便通过有线传输,或者发送源机器格式的一些指示符,希望接收器能够适当地处理这些指示符


前一种方法更为常见。事实上,这是POSIX定义的角色。如果您没有这些方法,您自己也不难实现它们——最大的技巧(而且没有那么大)是确定本机字节顺序。

非常感谢。我现在完全收到了数据。:D感谢您的解释。:D