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
Post a Comment