I have a problem getting this to work. Server only recieves half of the data being sent. Whats wrong

Dependencies:   mbed

main.cpp

Committer:
tax
Date:
2011-03-29
Revision:
0:66300c77c6e9

File content as of revision 0:66300c77c6e9:

#include "mbed.h"
#include "EthernetNetIf.h"
#include "TCPSocket.h"
#include "netif.h"

/*
#Use the following python script as server

import os.path
from socket import *
from datetime import *

HOST = ''
PORT = 1234
ADDR = (HOST,PORT)
BUFSIZE = 4096
 
serv = socket(AF_INET,SOCK_STREAM)

serv.bind((ADDR))
serv.listen(5)
print 'listening...'
while 1:
    conn,addr = serv.accept()
    print 'Someone connected from %s' % (addr[0])
    print addr 
    i = 0
    while(1):
        filename = str(i)+".txt"
        if not os.path.isfile(filename):
            break
        i=i+1
        
    FILE = open(filename,"w")
    starttime = datetime.now()
    amount = 0
    while(1):
        data = conn.recv(BUFSIZE)
        if data:
            if len(data) > 0:
                amount += len(data)
                FILE.write(data)
                conn.recv(BUFSIZE)
        else:
            print "disconnected"
            break;
        
        c = (datetime.now() - starttime)
        milliseconds = (c.days * 24 * 60 * 60 + c.seconds) * 1000 + c.microseconds / 1000.0
        if milliseconds > 0:
            print "%d bytes in %f seconds -> %f B/s" % (amount , (milliseconds/1000.0), amount / (milliseconds/1000.0))
    conn.close()
    FILE.close()
    
*/



EthernetNetIf *eth; 

//Socket to upload data
Host* tcpAddr;
TCPSocket* tcp;
bool socket_writable = false;
bool socket_connected = false;

#define PACKET_SIZE 300
#define PACKET_COUNT 20


unsigned long x = 0;
char buffer[PACKET_SIZE];

void sendNextChunk()
{
    if(x<PACKET_SIZE*PACKET_COUNT)
    {
        unsigned long y = x;
        for(int i=0;i<PACKET_SIZE;i++)
        {
            buffer[i]=(y++)%256;
        }
        int ret = tcp->send(buffer, PACKET_SIZE);
        if(ret > 0)
        {
            x+=ret;
            printf("%d \r\n", x);
        }
        else
        {
            printf("some error: %d\r\n", ret);
        }
    }
}


void onTCPSocketEvent(TCPSocketEvent e)
{
    time_t t_seconds = time(NULL);
    switch(e)
    {
        case TCPSOCKET_CONNECTED:
            printf("Connected\r\n");
        case TCPSOCKET_WRITEABLE:
            sendNextChunk();
            break;
        case TCPSOCKET_READABLE:
            break;
        case TCPSOCKET_CONTIMEOUT:
        case TCPSOCKET_CONRST:
        case TCPSOCKET_CONABRT:     
        case TCPSOCKET_ERROR:
            socket_writable = false;
            printf("%s Connection Error: %i\r\n", ctime(&t_seconds),e);
            tcp->close();
            socket_connected=false;
            break;
        case TCPSOCKET_DISCONNECTED:
            socket_writable = false;
            printf("%s Disconnected\r\n", ctime(&t_seconds));
            tcp->close();
            socket_connected=false;
            break;
        default:
            printf("%s Unknown callback\r\n", ctime(&t_seconds));
            break;    
    }
}

int main() 
{
    eth = new EthernetNetIf();
    tcp = new TCPSocket();
    tcp->setOnEvent(&onTCPSocketEvent);
    EthernetErr ethErr = eth->setup();       // thats using dhcp
    if( ethErr == ETH_OK )
    {
        IpAddr ip = eth->getIp();
        printf("mbed IP Address is %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]);
    }
    tcpAddr = new Host(IpAddr(192,168,1,18), 1234, "");
    IpAddr ip = tcpAddr->getIp();
    printf("Server IP Address is %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]);
    tcp->connect(*tcpAddr);
    Timer t;
    t.start();
    printf("start\r\n");
    while(x<PACKET_SIZE*PACKET_COUNT)
    {
        Net::poll();
    }
    printf("stop\r\n");
    tcp->close();
    t.stop();
    printf("%d bytes in %f seconds %f\r\n", PACKET_SIZE*PACKET_COUNT, t.read(), (PACKET_SIZE*PACKET_COUNT)/t.read());
    while(1){}
}