| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #include "board.h"
- #include <stdio.h>
- // UDP实验任务
- #if 1 // 使用SOCKET接口
- #include "sockets.h"
- void eth_udp_test(void *pvParameters)
- {
- int sock = -1;
- char recv_data[1524];
- struct sockaddr_in udp_addr,seraddr;
- int recv_data_len;
- socklen_t addrlen;
- int i;
- printf("-------------- Lwip TCP UDP Test Start! -------------\n");
- while (1) {
- sock = socket(AF_INET, SOCK_DGRAM, 0);
- if (sock < 0)
- {
- printf("Socket error\n");
- goto __exit;
- }
- udp_addr.sin_family = AF_INET;
- udp_addr.sin_addr.s_addr = INADDR_ANY;
- udp_addr.sin_port = htons(8088);
- memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));
- if (bind(sock, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) == -1) {
- printf("Unable to bind\n");
- goto __exit;
- }
- while (1) {
- recv_data_len=recvfrom(sock, recv_data,
- sizeof(recv_data), 0,
- (struct sockaddr*)&seraddr,
- &addrlen);
- /*显示发送端的IP地址*/
- printf("\r\nreceive from %s\n",inet_ntoa(seraddr.sin_addr));
- /*显示发送端发来的字串*/
- for (i = 0; i < recv_data_len; i++) {
- printf("%c", recv_data[i]);
- }
- /*将字串返回给发送端*/
- sendto(sock,recv_data,
- recv_data_len,0,
- (struct sockaddr*)&seraddr,
- addrlen);
- }
- __exit:
- if (sock >= 0) closesocket(sock);
- if (recv_data) free(recv_data);
- }
- }
- #else // 使用NETCONN接口
- #include "tcpip.h"
- #include "api.h"
- void eth_udp_test(void *pvParameters)
- {
- err_t err;
- static struct netconn *udpconn;
- static struct netbuf *sentbuf;
- static struct netbuf *recvbuf;
- ip_addr_t destipaddr;
- struct pbuf *q;
- int i;
- char *g_lwip_demo_sendbuf = "UDP TX TEST!0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
- printf("-------------- Lwip TCP UDP Test Start! -------------\n");
- /* 第一步:创建udp控制块 */
- udpconn = netconn_new(NETCONN_UDP);
- /* 定义接收超时时间 */
- udpconn->recv_timeout = 10;
- if (udpconn != NULL) /* 判断创建控制块释放成功 */
- {
- /* 第二步:绑定控制块、本地IP和端口 */
- err = netconn_bind(udpconn, IP_ADDR_ANY, 8080);
- /* 构造目的IP地址 */
- IP4_ADDR(&destipaddr, 192, 168, 137, 1);
- /* 第三步:连接或者建立对话框 */
- netconn_connect(udpconn, &destipaddr, 8086); /* 连接到远端主机 */
- if (err == ERR_OK) { /* 绑定完成 */
- sentbuf = netbuf_new();
- netbuf_alloc(sentbuf, strlen((char *)g_lwip_demo_sendbuf));
- memcpy(sentbuf->p->payload, (void *)g_lwip_demo_sendbuf, strlen((char *)g_lwip_demo_sendbuf));
- err = netconn_send(udpconn, sentbuf); /* 将netbuf中的数据发送出去 */
- if (err != ERR_OK)
- {
- printf("发送失败\r\n");
- netbuf_delete(sentbuf); /* 删除buf */
- }
- netbuf_delete(sentbuf); /* 删除buf */
- while(1) {
- netconn_recv(udpconn, &recvbuf);
- if (recvbuf != NULL) { /* 接收到数据 */
- printf("\nudp rx:\n");
- for (q = recvbuf->p; q != NULL; q = q->next) { /* 遍历完整个pbuf链表 */
- for (i=0; i<q->len; i++)
- printf("%c", ((char *)q->payload)[i]);
- }
- err = netconn_send(udpconn, recvbuf); /* 将netbuf中的数据发送出去 */
- if (err != ERR_OK) {
- printf("发送失败\r\n");
- }
- netbuf_delete(recvbuf); /* 删除buf */
- }
- }
- vTaskDelay(10);
- }
- else printf("UDP绑定失败\r\n");
- }
- else printf("UDP连接创建失败\r\n");
- }
- #endif
|