|
【示例程序】lwip通过UDP向计算机发送数据 |
一派护法 十九级 |
【单片机端程序】 #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); }
|
一派护法 十九级 |
【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(); } } }
|
一派护法 十九级 |
【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...
|
一派护法 十九级 |
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; }
|
一派护法 十九级 |
【发送局部变量的方法】 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; // 之后的代码省略
|
一派护法 十九级 |
如果设为PBUF_RAM,lwip则会自动分配内存。分配了多大的内存就发送多少字节,UDP里一般不采用这种方式。 p = pbuf_alloc(PBUF_TRANSPORT, 30, PBUF_RAM); // 发送30个字符 sprintf(p->payload, "upcb=%p", upcb); // 不够30个字符 PC端收到的内容:
|