mirror of
https://github.com/pvvx/RTL00MP3.git
synced 2025-07-31 12:41:06 +00:00
add example
This commit is contained in:
parent
0cd01e4dc1
commit
5cd34b0c9f
75 changed files with 6023 additions and 217 deletions
|
|
@ -3,8 +3,12 @@
|
|||
#include <platform/platform_stdlib.h>
|
||||
#include <lwip/sockets.h>
|
||||
|
||||
#if LWIP_SOCKET
|
||||
#define CONNECT_REMOTE 0
|
||||
|
||||
#if CONNECT_REMOTE
|
||||
#define REMOTE_HOST "192.168.13.14"
|
||||
#define REMOTE_PORT 5000
|
||||
#endif
|
||||
#define MAX_SOCKETS 10
|
||||
#define SELECT_TIMEOUT 10
|
||||
#define SERVER_PORT 5000
|
||||
|
|
@ -12,31 +16,68 @@
|
|||
|
||||
static void example_socket_select_thread(void *param)
|
||||
{
|
||||
int max_socket_fd = -1;
|
||||
#if CONNECT_REMOTE
|
||||
struct sockaddr_in remote_addr;
|
||||
int remote_fd = -1;
|
||||
#endif
|
||||
struct sockaddr_in server_addr;
|
||||
int server_fd = -1;
|
||||
int socket_used[10];
|
||||
int socket_used[MAX_SOCKETS];
|
||||
|
||||
// Delay to wait for IP by DHCP
|
||||
vTaskDelay(10000);
|
||||
printf("\nExample: socket select\n");
|
||||
|
||||
memset(socket_used, 0, sizeof(socket_used));
|
||||
|
||||
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {
|
||||
socket_used[server_fd] = 1;
|
||||
#if CONNECT_REMOTE
|
||||
reconnect:
|
||||
if((remote_fd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {
|
||||
remote_addr.sin_family = AF_INET;
|
||||
remote_addr.sin_addr.s_addr = inet_addr(REMOTE_HOST);
|
||||
remote_addr.sin_port = htons(REMOTE_PORT);
|
||||
|
||||
if(connect(remote_fd, (struct sockaddr *) &remote_addr, sizeof(remote_addr)) == 0) {
|
||||
printf("connect socket fd(%d)\n", remote_fd);
|
||||
socket_used[remote_fd] = 1;
|
||||
|
||||
if(remote_fd > max_socket_fd)
|
||||
max_socket_fd = remote_fd;
|
||||
}
|
||||
else {
|
||||
printf("connect error\n");
|
||||
close(remote_fd);
|
||||
goto reconnect;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("socket error\n");
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {
|
||||
server_addr.sin_family = AF_INET;
|
||||
server_addr.sin_port = htons(SERVER_PORT);
|
||||
server_addr.sin_addr.s_addr = INADDR_ANY;
|
||||
|
||||
server_addr.sin_family = AF_INET;
|
||||
server_addr.sin_port = htons(SERVER_PORT);
|
||||
server_addr.sin_addr.s_addr = INADDR_ANY;
|
||||
if(bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) != 0) {
|
||||
printf("bind error\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if(bind(server_fd, (struct sockaddr *) &server_addr, sizeof(server_addr)) != 0) {
|
||||
printf("bind error\n");
|
||||
goto exit;
|
||||
if(listen(server_fd, LISTEN_QLEN) != 0) {
|
||||
printf("listen error\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
socket_used[server_fd] = 1;
|
||||
|
||||
if(server_fd > max_socket_fd)
|
||||
max_socket_fd = server_fd;
|
||||
}
|
||||
|
||||
if(listen(server_fd, LISTEN_QLEN) != 0) {
|
||||
printf("listen error\n");
|
||||
else {
|
||||
printf("socket error\n");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
|
@ -54,7 +95,7 @@ static void example_socket_select_thread(void *param)
|
|||
if(socket_used[socket_fd])
|
||||
FD_SET(socket_fd, &read_fds);
|
||||
|
||||
if(select(MAX_SOCKETS, &read_fds, NULL, NULL, &timeout)) {
|
||||
if(select(max_socket_fd + 1, &read_fds, NULL, NULL, &timeout)) {
|
||||
for(socket_fd = 0; socket_fd < MAX_SOCKETS; socket_fd ++) {
|
||||
if(socket_used[socket_fd] && FD_ISSET(socket_fd, &read_fds)) {
|
||||
if(socket_fd == server_fd) {
|
||||
|
|
@ -65,6 +106,9 @@ static void example_socket_select_thread(void *param)
|
|||
if(fd >= 0) {
|
||||
printf("accept socket fd(%d)\n", fd);
|
||||
socket_used[fd] = 1;
|
||||
|
||||
if(fd > max_socket_fd)
|
||||
max_socket_fd = fd;
|
||||
}
|
||||
else {
|
||||
printf("accept error\n");
|
||||
|
|
@ -88,6 +132,8 @@ static void example_socket_select_thread(void *param)
|
|||
else {
|
||||
printf("TCP server: no data in %d seconds\n", SELECT_TIMEOUT);
|
||||
}
|
||||
|
||||
vTaskDelay(10);
|
||||
}
|
||||
|
||||
exit:
|
||||
|
|
@ -102,5 +148,3 @@ void example_socket_select(void)
|
|||
if(xTaskCreate(example_socket_select_thread, ((const char*)"example_socket_select_thread"), 1024, NULL, tskIDLE_PRIORITY + 1, NULL) != pdPASS)
|
||||
printf("\n\r%s xTaskCreate(init_thread) failed", __FUNCTION__);
|
||||
}
|
||||
|
||||
#endif // LWIP_SOCKET
|
||||
|
|
|
|||
|
|
@ -1,13 +1,17 @@
|
|||
LWIP SOCKET SELECT EXAMPLE
|
||||
|
||||
Description:
|
||||
TCP server listens on port 5000 and handle socket by select().
|
||||
Use socket select() to handle socket read from clients or remote server.
|
||||
|
||||
Configuration:
|
||||
Modify SERVER_PORT definition for listen port of created TCP server.
|
||||
Can enable CONNECT_REMOTE to include TCP connection to remote server in example. Modify REMOTE_HOST and REMOTE_PORT for remote server.
|
||||
|
||||
[platform_opts.h]
|
||||
#define CONFIG_EXAMPLE_SOCKET_SELECT 1
|
||||
|
||||
Execution:
|
||||
Can make automatical Wi-Fi connection when booting by using wlan fast connect example.
|
||||
A socket select example thread will be started automatically when booting.
|
||||
|
||||
A local TCP server will be started to wait for connection. Can use a TCP client connecting to this server to send data.
|
||||
If CONNECT_REMOTE is enabed in example. A remote TCP server is required and can send data to the created remote connection.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue