Hi,
Below is an example of MDK code for implementing a BSD Server: (Unfortunately, the "Insert->Code" feature in this forum did not function properly when tested across multiple browsers. Please accept my apologies for posting the text without proper code formatting)
/*------------------------------------------------------------------------------ * MDK Middleware - Component ::Network * Copyright (c) 2004-2015 ARM Germany GmbH. All rights reserved. *------------------------------------------------------------------------------ * Name: BSD_Server.c * Purpose: LED Server example using BSD sockets *----------------------------------------------------------------------------*/#include <stdio.h>#include <string.h>#include "cmsis_os.h" // ARM::CMSIS:RTOS:Keil RTX#include "rl_net.h" // Keil.MDK-Pro::Network:CORE#include "GPIO_STM32F10x.h" // Keil::Device:GPIO#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC#include "Board_LED.h" // ::Board Support:LED#include "Board_GLCD.h" // ::Board Support:Graphic LCD#include "GLCD_Config.h" // Keil.MCBSTM32C::Board Support:Graphic LCD//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------// <o>Socket Address Family <0=>IPv4 <1=>IPv6// <i> Define either IPv4 or IPv6 connections are accepted// <i> Default: 1#define SOCK_AF 0// <o>Socket Local Port <1-65535>// <i> Do not set number of port too small,// <i> maybe it is already used.// <i> Default: 1001#define SOCK_PORT 1001//------------- <<< end of configuration section >>> -----------------------#define BLINKLED 0x01 /* Command for blink the leds */extern GLCD_FONT GLCD_Font_16x24; SOCKADDR_IN6 addr; int sock, sd, res; char dbuf[4]; int i,j;static void Server (void const *arg);osThreadDef(Server, osPriorityNormal, 2, 0);/// Initialize displaystatic void init_display () { GLCD_Initialize (); GLCD_SetBackgroundColor (GLCD_COLOR_BLUE); GLCD_SetForegroundColor (GLCD_COLOR_WHITE); GLCD_ClearScreen (); GLCD_SetFont (&GLCD_Font_16x24); GLCD_DrawString (0, 1*24, " MDK-MW "); GLCD_DrawString (0, 2*24, " BSD Server example ");}/// Print IP addressesstatic void print_address (void) { static uint8_t ip_addr[NET_ADDR_IP6_LEN]; static char ip_ascii[40]; static char buf[24];#if (SOCK_AF == 0) /* Print IPv4 network address */ netIF_GetOption (NET_IF_CLASS_ETH, netIF_OptionIP4_Address, ip_addr, sizeof(ip_addr)); netIP_ntoa (NET_ADDR_IP4, ip_addr, ip_ascii, sizeof(ip_ascii)); sprintf (buf, "IP4=%-15s", ip_ascii); GLCD_DrawString (0, 5*24, buf);#else /* Print IPv6 network address */ netIF_GetOption (NET_IF_CLASS_ETH, netIF_OptionIP6_LinkLocalAddress, ip_addr, sizeof(ip_addr)); netIP_ntoa(NET_ADDR_IP6, ip_addr, ip_ascii, sizeof(ip_ascii)); sprintf (buf, "IP6=%.16s", ip_ascii); GLCD_DrawString (0, 5*24, buf); sprintf (buf, "%s",ip_ascii+16); GLCD_DrawString (10*16, 6*24, buf);#endif}/*---------------------------------------------------------------------------- Thread 'Server': BSD server socket process (2 instances) *---------------------------------------------------------------------------*/static void Server (void const *arg) { int type = (int)arg; while (1) { /* Setup network parameters */ memset (&addr, 0, sizeof(addr));#if (SOCK_AF == 0) /* Accept only IPv4 connections */ addr.sin6_family = AF_INET;#else /* Accept only IPv6 connections */ addr.sin6_family = AF_INET6;#endif addr.sin6_port = htons(SOCK_PORT); /* Create socket */ sock = socket (addr.sin6_family, type, 0); /* Bind address and port to socket */ bind (sock, (SOCKADDR *)&addr, sizeof(addr)); if (type == SOCK_STREAM) { listen (sock, 1); sd = accept (sock, NULL, NULL); closesocket (sock); sock = sd; } j=j+1; if(j>6000) { j=0; } while (1) { i=i+1; if(i>6000) { i=0; } res = recv (sock, dbuf, sizeof (dbuf), 0); if (res <= 0) { break; } if (dbuf[0] == BLINKLED) { // LED_SetOut (dbuf[1]); } } closesocket (sock); }}/*---------------------------------------------------------------------------- Main Thread 'main': Run Network *---------------------------------------------------------------------------*/int main (void) { netInitialize (); /* Create BSD socket processor threads */ osThreadCreate (osThread(Server), (void *)SOCK_STREAM); while(1) { osSignalWait (0, osWaitForever); }}
I can ping the device successfully; however, I cannot establish a connection to port 1001 using Telnet. As shown in the debug video, the socket opens and closes simultaneously, which may indicate an underlying issue.The J variable is being incremented before the while loop, but it should only be assigned a single value after creating the thread. This is likely causing unexpected behavior in this code.
J
while
To resolve the problem, the following changes are necessary. The code utilizes IPv6; however, it should be modified to use IPv4 instead.
1)SOCK_AF =0
2)SOCKADDR_IN6 to SOCKADDR_IN
3)
addr.sin_port = htons(PORT_NUM); addr.sin_family = PF_INET; addr.sin_addr.s_addr = INADDR_ANY;