 |
【單片機端程序】 #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端收到的內容: 
|