作者共发了6篇帖子。 内容转换:不转换▼
 
点击 回复
586 5
【示例程序】lwip通过UDP向计算机发送数据
一派护法 十九级
1楼 发表于:2017-4-6 20:49
【单片机端程序】
#include <string.h>
#include "lwip/udp.h"

void recvtest(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
    uint16_t i;
    if (p != NULL)
    {
        printf("Recved: ");
        for (i = 0; i < p->len; i++)
            putchar(((char *)p->payload)[i]);
        putchar('\n');
        pbuf_free(p);
    }
    udp_remove(pcb); // 这里的pcb和test函数里的upcb是一样的
}

void test(void)
{
    char *str = "Hello World!";
    ip_addr_t ipaddr;
    struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, strlen(str), PBUF_ROM);
    struct udp_pcb *upcb = udp_new();
    p->payload = str; // 要发送的数据
   
    IP4_ADDR(&ipaddr, 192, 168, 1, 106); // 目的地址
    //udp_connect(upcb, &ipaddr, 82); // 端口号为82
    //udp_send(upcb, p);
    udp_sendto(upcb, p, &ipaddr, 82);
    pbuf_free(p);
    udp_recv(upcb, recvtest, NULL);
}
一派护法 十九级
2楼 发表于:2017-4-6 20:49
【PC端Java程序】
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Test {
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(82);
           
            // 接收并显示数据
            byte[] data = new byte[100];
            DatagramPacket dp = new DatagramPacket(data, data.length);
            System.out.println("Begin...");
            ds.receive(dp);
            InetAddress addr = dp.getAddress(); // 发送者地址
            int port = dp.getPort(); // 发送者端口
           
            String content = new String(data, 0, dp.getLength());
            System.out.println("Recved! Content: " + content);
            System.out.println("From: " + addr.toString().replace("/", "") + ":" + port);
           
            // 发送回应
            String str = "Response...";
            data = str.getBytes();
            dp = new DatagramPacket(data, data.length, addr, port);
            ds.send(dp);
           
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
一派护法 十九级
3楼 发表于:2017-4-6 20:51
【PC端输出】
Begin...
Recved! Content: Hello World!
From: 192.168.1.116:49153
【单片机端输出】
DHCP分配成功!
IP地址: 192.168.1.116
子网掩码: 255.255.255.0
网关: 192.168.1.1
DNS服务器: 192.168.1.1
Not in cache! err=-5
DNS Found IP: 106.186.126.193
Recved: Response...
一派护法 十九级
4楼 发表于:2017-4-6 20:52
test函数是在DHCP成功分配IP地址后调用的:
void show_addr(struct netif *netif)
{
    struct dhcp *dhcp = netif_dhcp_data(netif);
    static uint8_t displayed = 0;
    if (dhcp_supplied_address(netif))
    {
        if (displayed == 0)
        {
            printf("DHCP分配成功!\n");
            printf("IP地址: %s\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
            printf("子网掩码: %s\n", ip4addr_ntoa(&dhcp->offered_sn_mask));
            printf("网关: %s\n", ip4addr_ntoa(&dhcp->offered_gw_addr));
            printf("DNS服务器: %s\n", ip4addr_ntoa(dns_getserver(0)));
            displayed = 1;
            test_dns(netif);
            test(); // UDP测试
        }
    }
    else
        displayed = 0;
}
一派护法 十九级
5楼 发表于:2017-4-6 20:57
【发送局部变量的方法】
void test(void)
{
    char str[30];
    ip_addr_t ipaddr;
    struct pbuf *p;
    struct udp_pcb *upcb = udp_new();
    sprintf(str, "upcb=%p", upcb);
    p = pbuf_alloc(PBUF_TRANSPORT, strlen(str), PBUF_REF); // 发送RAM数据时应该采用PBUF_REF类型
    p->payload = str;
    // 之后的代码省略
一派护法 十九级
6楼 发表于:2017-4-6 21:02
如果设为PBUF_RAM,lwip则会自动分配内存。分配了多大的内存就发送多少字节,UDP里一般不采用这种方式。
p = pbuf_alloc(PBUF_TRANSPORT, 30, PBUF_RAM); // 发送30个字符
sprintf(p->payload, "upcb=%p", upcb); // 不够30个字符

PC端收到的内容:

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:586 回复数:5
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2017-4-6 21:02
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。