Dear All,
I run a TCP server on esp32. I use a packet sender program to test whether
ESP32 receives multiple messages using TCP connection, I use official TCP
Sock example in offfical docs of RIOT OS. I use lwIP stack to establish TCP.
The code and makefile are as follows, i tried several ways to recive
multiple messages. However then a message receives after that " Error
accepting new sock " is given. ;
Thanks for your help.
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "thread.h"
#include "xtimer.h"
#include "od.h"
#include "net/af.h"
#include "net/sock/tcp.h"
#include "net/ipv6.h"
#include "shell.h"
#include "net/af.h"
#include "net/sock/tcp.h"
#include "lwip/netif.h"
#define SOCK_QUEUE_LEN (1U)
sock_tcp_t sock_queue;
uint8_t buf[128];
/* import "ifconfig" shell command, used for printing addresses */
//extern int _gnrc_netif_config(int argc, char **argv);
static int print_ip(void)
{
for (struct netif *iface = netif_list; iface != NULL; iface =
iface->next) {
printf("%s_%02u: ", iface->name, iface->num);
char addrstr[IPV6_ADDR_MAX_STR_LEN];
for (int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {
if (!ipv6_addr_is_unspecified((ipv6_addr_t
*)&iface->ip6_addr[i])) {
printf(" inet6 %s\n", ipv6_addr_to_str(addrstr,
(ipv6_addr_t *)&iface->ip6_addr[i],
sizeof(addrstr)));
}
}
puts("");
}
return 0;
}
int main(void)
{
print_ip();
sock_tcp_ep_t local = SOCK_IPV6_EP_ANY;
sock_tcp_queue_t queue;
local.port = 12345;
if (sock_tcp_listen(&queue, &local, &sock_queue, 1,
SOCK_FLAGS_REUSE_EP) < 0) {
puts("Error creating listening queue");
return 1;
}
puts("Listening on port 12345");
/*
puts("Configured network interfaces2:");
_gnrc_netif_config(0, NULL);
*/
while (1) {
// puts("Configured network interfaces:");
// _gnrc_netif_config(0, NULL);
sock_tcp_t *sock;
if (sock_tcp_accept(&queue, &sock, SOCK_NO_TIMEOUT) < 0) {
puts("Error accepting new sock");
}
else {
int read_res = 0;
puts("Reading data");
while (read_res >= 0) {
read_res = sock_tcp_read(sock, &buf, sizeof(buf),
SOCK_NO_TIMEOUT);
if (read_res < 0) {
puts("Disconnected");
break;
}
else {
int write_res;
printf("Read: \"");
for (int i = 0; i < read_res; i++) {
printf("%c", buf[i]);
}
puts("\"");
if ((write_res = sock_tcp_write(sock, &buf,
read_res)) < 0) {
puts("Errored on write, finished server loop");
break;
}
}
}
sock_tcp_disconnect(sock);
}
}
sock_tcp_stop_listen(&queue);
return 0;
}
---------------------------------------------------- Makefile
---------------------------------------------------------
# name of your application
APPLICATION = tcp-simple-server
# If no BOARD is found in the environment, use this default:
BOARD ?= esp32-wroom-32
# This has to be the absolute path to the RIOT base directory:
RIOTBASE ?= $(CURDIR)/../..
BOARD_INSUFFICIENT_MEMORY := arduino-duemilanove arduino-leonardo \
arduino-mega2560 arduino-nano \
arduino-uno blackpill bluepill calliope-mini \
chronos hifive1 i-nucleo-lrwan1 mega-xplained \
microbit msb-430 msb-430h \
nucleo-f031k6 nucleo-f042k6 nucleo-f303k8 \
nucleo-l031k6 nucleo-f030r8 nucleo-f070rb \
nucleo-f072rb nucleo-f103rb nucleo-f302r8 \
nucleo-f334r8 nucleo-l053r8 saml10-xpro \
saml11-xpro spark-core stm32f0discovery \
stm32l0538-disco telosb \
waspmote-pro wsn430-v1_3b wsn430-v1_4 z1
# module as used in tests/lwip
USEMODULE += lwip lwip_ipv6_autoconfig lwip_sock_ip lwip_netdev
USEMODULE += lwip_tcp lwip_sock_tcp
USEMODULE += ipv6_addr
USEMODULE += shell
USEMODULE += shell_commands
USEMODULE += ps
USEMODULE += od
USEMODULE += netdev_default
# additional modules for the application
USEMODULE += netstats_l2
USEMODULE += netstats_ipv6
USEMODULE += netstats_rpl
USEMODULE += esp_wifi
include $(RIOTBASE)/Makefile.include
_______________________________________________
users mailing list
[email protected]
https://lists.riot-os.org/mailman/listinfo/users