TCP Sockets and .Net Micro Framework -


i'm new sockets , can't seem app working. want send log file netduino+2 laptop. approach took prepend file size byte array before sending. however, never seem receive send. realize common problem folks new sockets , i've searched high , low find tips on how avoid problem. maybe unique micro framework, kind of doubt it.

here code. i've got client app runs on n+2 , console app running on laptop. data file i'm retrieving attached below. sort of works, not delivering file consistently. can give me appreciated.

client app running on n+2. when press onboard button, sends file.

using system; using system.net; using system.net.sockets; using system.threading; using system.text; using system.io; using microsoft.spot; using microsoft.spot.hardware; using secretlabs.netmf.hardware; using secretlabs.netmf.hardware.netduino;  namespace socketclient     {      public class program         {         static string strdeviceip = "";         static string strdevicesubnet = "";         static string strdevicegateway = "";         static string strdeviceport = "";         static string strcontrollerip = "";          public static outputport opled = new outputport(pins.gpio_pin_d13, false);         inputport button = new inputport(pins.onboard_sw1, false, port.resistormode.disabled);          public static void main()             {             strdeviceip = "192.168.2.102";             strdevicesubnet = "255.255.255.0";             strdevicegateway = "192.168.2.2";             strcontrollerip = "192.168.2.222";             strdeviceport = "9999";             interruptport btn = new interruptport(pins.onboard_sw1, false,                                port.resistormode.disabled, port.interruptmode.interruptedgelow);             btn.oninterrupt += new nativeeventhandler(buttonpress);              while (true)                 {                  }             }          public static void buttonpress(uint data1, uint data2, datetime time)             {             opled.write(true);              socket socket = new socket(addressfamily.internetwork, sockettype.stream,                     protocoltype.tcp);             ipaddress hostaddress = ipaddress.parse(strcontrollerip);             ipendpoint endpoint = new ipendpoint(hostaddress, int32.parse(strdeviceport));              string filename = "runlog2.txt";              // read file byte array             byte[] data = file.readallbytes(@"sd\" + filename);             byte[] sizeinfo = new byte[4];             byte[] senddata = new byte[4 + data.length];              // check make sure it's not big             if (data.length > 850 * 1024)                 {                 debug.print("file large");                 }              // convert data.length byte array             sizeinfo[0] = (byte)data.length;             sizeinfo[1] = (byte)(data.length >> 8);             sizeinfo[2] = (byte)(data.length >> 16);             sizeinfo[3] = (byte)(data.length >> 24);              // prepend size senddata array             sizeinfo.copyto(senddata, 0);              // copy read data senddata array             data.copyto(senddata, 4);              // send data             socket.connect(endpoint);             socket.send(senddata);             socket.close();             opled.write(false);             }         }     } 

here server side console app.

    using system; using system.collections.generic; using system.linq; using system.text; using system.io; using system.net; using system.net.sockets; using system.collections; using system.threading;      namespace socketconsole     {     class program         {         static void main(string[] args)             {             thread thread1 = new thread(new threadstart(listener));             thread1.start();                while (true)                 {                 }             }         public static void listener()             {             try                 {                 socket sktmain = new socket(addressfamily.internetwork, sockettype.stream,                                        protocoltype.tcp);                 sktmain.bind(new ipendpoint(ipaddress.parse("192.168.2.222"), 9999));                 sktmain.listen(10);                 var message = new arraylist();                  while (true)                     {                     // create client socket                     using (var client = sktmain.accept())                         {                         //if connected,                         if (socketconnected(client, 100))                             {                             while (socketconnected(client, 100))                                 {                                 byte[] sizeinfo = new byte[4];                                  //read size of message sizeinfo                                 int totalread = 0, currentread = 0;                                 currentread = totalread = client.receive(sizeinfo, 4,                                  socketflags.none);                                  while (totalread < sizeinfo.length && currentread > 0)                                     {                                     currentread = client.receive(sizeinfo, totalread,                                  sizeinfo.length - totalread, socketflags.none);                                     totalread += currentread;                                     }                                  int messagesize = 0;                                 messagesize |= sizeinfo[0];                                 messagesize |= (((int)sizeinfo[1]) << 8);                                 messagesize |= (((int)sizeinfo[2]) << 16);                                 messagesize |= (((int)sizeinfo[3]) << 24);                                  byte[] data = new byte[messagesize];                                 totalread = 0;                                 currentread = totalread = client.receive(data, 0, data.length -                                totalread, socketflags.none);                                 var received = encoding.utf8.getchars(data);                                  int diff = data.length - totalread;                                  while (totalread < messagesize && currentread > 0)                                     {                                     currentread = client.receive(data, 0, data.length - totalread,                                     socketflags.none);                                     totalread += currentread;                                     (var = 0; < received.length; i++)                                         message.add(received[i]);                                     }                                 string fname = "runlog.txt";                                 if (file.exists(fname)) file.delete(fname);                                  binarywriter bwrite = new binarywriter(file.open(fname,                               filemode.create));                                 bwrite.write(data);                                 bwrite.close();                                 }                             }                         }                     }                 }                 catch (exception ex)                 {                 console.writeline(ex.message);                 }             }             // socket polling            static bool socketconnected(socket s, int ms)                {                return !(s.poll(ms, selectmode.selectread) & (s.available == 0));                }          }     } 

if @ byte array data, after receiving data, every byte above 255 has value of 0. it's if stops reading @ 255. if debug.print in while loop filling "data", following output:

client accepting data  client.receive sizeinfo: currentread = 4, totalread = 4  total message size = 3296  client.receive data: currentread = 252, totalread = 252  client.receive data: currentread = 256 totalread = 508  client.receive data: currentread = 256 totalread = 764  client.receive data: currentread = 256 totalread = 1020  client.receive data: currentread = 256 totalread = 1276  client.receive data: currentread = 256 totalread = 1532  client.receive data: currentread = 256 totalread = 1788  client.receive data: currentread = 256 totalread = 2044  client.receive data: currentread = 256 totalread = 2300  client.receive data: currentread = 256 totalread = 2556  client.receive data: currentread = 256 totalread = 2812  client.receive data: currentread = 256 totalread = 3068  client.receive data: currentread = 228 totalread = 3296  client.receive data final: currentread = 228 totalread = 3296 

so accepting 256 bytes each time, zero. obviously, don't understand what's going on:(

in second while loop, , while calling receive method, using way:

currentread = client.receive(data, 0, data.length - totalread, socketflags.none); 

the second parameter here denotes : "the location in buffer store received data."

this means read data overwriting old data.

you should replace following code:

currentread = client.receive(data, totalread, data.length - totalread, socketflags.none); 

because totalread varaible in code holds total read bytes can used point new location new received data.


Comments

Popular posts from this blog

php - get table cell data from and place a copy in another table -

javascript - Mootools wait with Fx.Morph start -

php - Navigate throught databse rows -