Skip to content

Commit d950ec2

Browse files
pfalconjukkar
authored andcommitted
samples: net: Add socket-based echo server example
The example source code is POSIX-compatible (modulo include files), i.e. can be built and behaves the same way for Zephyr and a POSIX system (e.g. Linux). Makefile.posix is available for the latter. Signed-off-by: Paul Sokolovsky <[email protected]>
1 parent 49eaa2b commit d950ec2

File tree

5 files changed

+127
-0
lines changed

5 files changed

+127
-0
lines changed

samples/net/socket_echo/Makefile

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Makefile - simple socket-based echo server
2+
3+
#
4+
# Copyright (c) 2017 Linaro Limited
5+
#
6+
# SPDX-License-Identifier: Apache-2.0
7+
#
8+
9+
BOARD ?= qemu_x86
10+
CONF_FILE ?= prj_$(BOARD).conf
11+
12+
include $(ZEPHYR_BASE)/Makefile.inc
13+
14+
ifeq ($(CONFIG_NET_L2_BLUETOOTH), y)
15+
QEMU_EXTRA_FLAGS = -serial unix:/tmp/bt-server-bredr
16+
else
17+
include $(ZEPHYR_BASE)/samples/net/common/Makefile.ipstack
18+
endif
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# This makefile builds socket_echo sample for POSIX system, like Linux
2+
3+
socket_echo: src/socket_echo.c
4+
$(CC) $^ -o $@
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# General config
2+
CONFIG_NEWLIB_LIBC=y
3+
4+
# Networking config
5+
CONFIG_NETWORKING=y
6+
CONFIG_NET_IPV4=y
7+
CONFIG_NET_IPV6=n
8+
CONFIG_NET_TCP=y
9+
CONFIG_NET_SOCKETS=y
10+
CONFIG_NET_SOCKETS_POSIX_NAMES=y
11+
12+
# Network driver config
13+
CONFIG_NET_SLIP_TAP=y
14+
CONFIG_TEST_RANDOM_GENERATOR=y
15+
16+
# Without CONFIG_NET_BUF_LOG printf() doesn't work
17+
CONFIG_NET_BUF_LOG=y
18+
19+
# Network address config
20+
CONFIG_NET_APP_SETTINGS=y
21+
CONFIG_NET_APP_MY_IPV4_ADDR="192.0.2.1"
22+
CONFIG_NET_APP_PEER_IPV4_ADDR="192.0.2.2"
23+
24+
# Network debug config
25+
#CONFIG_NET_DEBUG_SOCKETS=y
26+
CONFIG_SYS_LOG_NET_LEVEL=2
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
include $(ZEPHYR_BASE)/samples/net/common/Makefile.common
2+
3+
obj-y += socket_echo.o
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright (c) 2017 Linaro Limited
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <stdio.h>
8+
9+
#ifndef __ZEPHYR__
10+
11+
#include <netinet/in.h>
12+
#include <sys/socket.h>
13+
#include <arpa/inet.h>
14+
#include <unistd.h>
15+
16+
#define init_net()
17+
18+
#else
19+
20+
#include <net/socket.h>
21+
#include <kernel.h>
22+
#include <net_sample_app.h>
23+
24+
void init_net(void)
25+
{
26+
int ret = net_sample_app_init("socket_echo", NET_SAMPLE_NEED_IPV4,
27+
K_SECONDS(3));
28+
29+
if (ret < 0) {
30+
printf("Application init failed\n");
31+
k_panic();
32+
}
33+
}
34+
35+
#endif
36+
37+
int main(void)
38+
{
39+
int serv;
40+
struct sockaddr_in bind_addr;
41+
42+
init_net();
43+
44+
serv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
45+
46+
bind_addr.sin_family = AF_INET;
47+
bind_addr.sin_addr.s_addr = htonl(INADDR_ANY);
48+
bind_addr.sin_port = htons(4242);
49+
bind(serv, (struct sockaddr *)&bind_addr, sizeof(bind_addr));
50+
51+
listen(serv, 5);
52+
53+
while (1) {
54+
struct sockaddr_in client_addr;
55+
socklen_t client_addr_len = sizeof(client_addr);
56+
char addr_str[32];
57+
int client = accept(serv, (struct sockaddr *)&client_addr,
58+
&client_addr_len);
59+
inet_ntop(client_addr.sin_family, &client_addr.sin_addr,
60+
addr_str, sizeof(addr_str));
61+
printf("Connection from %s\n", addr_str);
62+
63+
while (1) {
64+
char buf[128];
65+
int len = recv(client, buf, sizeof(buf), 0);
66+
67+
if (len == 0) {
68+
break;
69+
}
70+
send(client, buf, len, 0);
71+
}
72+
73+
close(client);
74+
printf("Connection from %s closed\n", addr_str);
75+
}
76+
}

0 commit comments

Comments
 (0)