| 76 | #define UDP_SOCKET_BUFFER_SIZE 4096 |
| 77 | rt_thread_t udpecho_socket_tid = RT_NULL; |
| 78 | void udpecho_socket_entry(void *parameter) |
| 79 | { |
| 80 | int sock; |
| 81 | int bytes_read; |
| 82 | char *recv_data; |
| 83 | rt_uint32_t addr_len; |
| 84 | struct sockaddr_in server_addr, client_addr; |
| 85 | |
| 86 | /* allocate the data buffer */ |
| 87 | recv_data = rt_malloc(UDP_SOCKET_BUFFER_SIZE); |
| 88 | if (recv_data == RT_NULL) |
| 89 | { |
| 90 | /* no memory yet */ |
| 91 | rt_kprintf("no memory\n"); |
| 92 | return; |
| 93 | } |
| 94 | /* create a UDP socket */ |
| 95 | if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) |
| 96 | { |
| 97 | rt_kprintf("create socket error\n"); |
| 98 | goto _exit; |
| 99 | } |
| 100 | |
| 101 | /* initialize server address */ |
| 102 | server_addr.sin_family = AF_INET; |
| 103 | server_addr.sin_port = htons(UDP_SOCKET_ECHO_PORT); |
| 104 | server_addr.sin_addr.s_addr = INADDR_ANY; |
| 105 | rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero)); |
| 106 | |
| 107 | /* bind socket to server address */ |
| 108 | if (bind(sock,(struct sockaddr *)&server_addr, |
| 109 | sizeof(struct sockaddr)) == -1) |
| 110 | { |
| 111 | /* bind failed */ |
| 112 | rt_kprintf("bind error\n"); |
| 113 | goto _exit; |
| 114 | } |
| 115 | |
| 116 | addr_len = sizeof(struct sockaddr); |
| 117 | while (1) |
| 118 | { |
| 119 | /* try to receive from UDP socket */ |
| 120 | bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0, |
| 121 | (struct sockaddr *)&client_addr, &addr_len); |
| 122 | |
| 123 | /* send back */ |
| 124 | sendto(sock, recv_data, bytes_read, 0, |
| 125 | (struct sockaddr *)&client_addr, addr_len); |
| 126 | } |
| 127 | |
| 128 | _exit: |
| 129 | rt_free(recv_data); |
| 130 | return; |
| 131 | } |
| 132 | |
| 133 | /* |
| 134 | * TCP echo server |