Sample to show hanging during socket initialization

Dependencies:   EthernetInterface NTPClient mbed-rtos mbed

sample server (python) to go with the RTOSTest

Import programRTOSTest

Sample to show hanging during socket initialization

#!/usr/bin/python2.7

import sys, os
import asyncore, socket
import time, datetime

class EchoClient(asyncore.dispatcher_with_send):
	def handle_read(self):
		buffer = self.recv(1024)
		if buffer:
			print str(datetime.datetime.fromtimestamp(time.time()))
			print buffer
		else:
			self.close()
	
class Server(asyncore.dispatcher):
	def __init__(self, host, port):
		asyncore.dispatcher.__init__(self)
		self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
		self.set_reuse_addr()
		self.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
		self.bind(('', port))
		self.listen(8)

	def handle_accept(self):
		socket, address = self.accept()
		print str(datetime.datetime.fromtimestamp(time.time()))
		print 'Connection by', address
		EchoClient(socket)


s = Server('', 8080)
asyncore.loop()

main.cpp

Committer:
jonathonfletcher
Date:
2012-09-27
Revision:
1:92d3f1118200
Parent:
0:5197a41c178f

File content as of revision 1:92d3f1118200:

#include "mbed.h"
#include "rtos.h"

#include "EthernetInterface.h"
#include "NTPClient.h"

// XXX: Change this to a valid IP of your network.
const char *server_ip = "10.0.1.253";
const unsigned short server_port = 8080;

const char *newline = "\r\n";
const unsigned int connection_timeout = 6000;
const unsigned int network_ticker_period = 60000;
const unsigned int producer_ticker_period = 15000;


BusOut leds(LED1, LED2, LED3, LED4);

typedef struct {
    uint16_t count;
} tMessage;

Mail<tMessage, 64> mailbox;

EthernetInterface ethernet;
TCPSocketConnection socket;

static bool timeset = false;
NTPClient ntp;



void connection_callback()
{
    printf("%s:%d%s", __FILE__, __LINE__, newline);

    leds = (leds ^ 1);
    char data[512];
    char *p = data;

    uint16_t nmessages = 0;
    osEvent evt;
    do {
        evt = mailbox.get(0);
        if (osEventMail == evt.status) {
            tMessage *message = (tMessage *)evt.value.p;
            if (message) {
                nmessages += 1;
                p += snprintf(p, sizeof(data) - (p-data), "%d%s", message->count, newline);
                mailbox.free(message);
            }
        }
    } while (osEventMail == evt.status && (p-data) < 384);

    printf("%s:%d nmessages:%d%s", __FILE__, __LINE__, nmessages, newline);
    if (!socket.is_connected()) {
        socket.connect(server_ip, server_port);
    }

    printf("%s:%d%s", __FILE__, __LINE__, newline);
    if (socket.is_connected()) {
        if (p > data) {
            printf(data);
            printf(newline);
            printf("%s:%d%s", __FILE__, __LINE__, newline);
            int nsent = socket.send_all(data, (p-data)-1);
            printf("%s:%d: nmessages:%d, length:%d, nsent:%d, %s", __FILE__, __LINE__, nmessages, (p-data)-1, nsent, newline);
        }
        socket.close();
    } else {
        printf("%s:%d: nmessages:%d, discarded_length:%d%s", __FILE__, __LINE__, nmessages, (p-data)-1, newline);
    }

    printf("%s:%d%s", __FILE__, __LINE__, newline);
}


void network_callback (const void *context)
{
    printf("%s:%d%s", __FILE__, __LINE__, newline);

    if (!ethernet.getIPAddress()) {
        printf("%s:%d%s", __FILE__, __LINE__, newline);
        ethernet.connect(connection_timeout);
        printf("%s:%d%s", __FILE__, __LINE__, newline);
    }

    if (ethernet.getIPAddress()) {
        printf("%s:%d%s", __FILE__, __LINE__, newline);
        leds = (leds ^ 2);
        if (false == timeset) {
            printf("%s:%d%s", __FILE__, __LINE__, newline);
            if (NTP_OK == ntp.setTime("0.pool.ntp.org")) {
                printf("%s:%d timeset%s", __FILE__, __LINE__, newline);
                timeset = true;
            }
            printf("%s:%d%s", __FILE__, __LINE__, newline);
        }

        connection_callback();

        ethernet.disconnect();
        printf("%s:%d%s", __FILE__, __LINE__, newline);
    }

    printf("%s:%d%s", __FILE__, __LINE__, newline);
}


void producer_ticker(const void *context)
{
    printf("%s:%d%s", __FILE__, __LINE__, newline);
    static uint16_t counter = 0;

    tMessage *message = mailbox.alloc();
    if (message) {
        leds = (leds ^ 4);
        memset(message, 0, sizeof(*message));
        message->count = ++counter;
        mailbox.put(message);
    }
    printf("%s:%d%s", __FILE__, __LINE__, newline);
}


int main()
{
    printf("%s:%d%s", __FILE__, __LINE__, newline);
    ethernet.init();
    printf("%s:%d%s", __FILE__, __LINE__, newline);

    RtosTimer producer(producer_ticker);
    RtosTimer network(network_callback);
    printf("%s:%d%s", __FILE__, __LINE__, newline);

    producer.start(producer_ticker_period);
    network.start(network_ticker_period);
    printf("%s:%d%s", __FILE__, __LINE__, newline);

    while (true) {
        Thread::wait(500);
        leds = (leds ^ 8);
    }
}