i did create socket application to send and receive images over internet
i did test the application locally and on vmware , it did works fine
also test it on some devices over internet also worked fine
but there is other devices that the Server application receive only small amount of the sent data
here is an image of the server
image
and this is the server code
while(true)
{
Socket socket = listener.AcceptSocket();
label4.Text = "Connected";
byte[] image = new byte[99999999];
int offset = -1;
int ite = 0;
while (true)
{
byte[] data = new byte[1024];
int count = socket.Receive(data);
if (count > 0)
{
String txt = Encoding.ASCII.GetString(data, 0, count);
if (txt.Contains("hello"))
{
label8.Text = txt;
continue;
}
if (!txt.Contains("end"))
{
ite += 1;
label7.Text = ite.ToString();
label12.Text = offset.ToString();
for (int i = 0; i <= count - 1; i++)
{
offset += 1;
image[offset] = data[i];
}
try
{
MemoryStream stream = new MemoryStream(image, 0, offset);
Image x = Image.FromStream(stream);
pictureBox1.Image = x;
}
catch (Exception ex)
{
}
}
else
{
label7.Text = ite.ToString();
ite = 0;
label5.Text = label2.Text;
label2.Text = offset.ToString();
MemoryStream stream = new MemoryStream(image, 0, offset);
Image x = Image.FromStream(stream);
pictureBox1.Image = x;
image = new byte[99999999];
offset = -1;
break;
}
}
}
}
and this is the client code
while (true)
{
TcpClient client = new TcpClient(ip, port);
NetworkStream stream = client.GetStream();
byte[] data = Capture();
int dataSize = 1024;
int offset = 0;
byte[] start = ASCIIEncoding.ASCII.GetBytes("hello " + data.Length.ToString());
stream.Write(start, 0, start.Length);
while (offset < data.Length)
{
int sum = offset + dataSize;
if (sum > data.Length)
{
dataSize = data.Length - offset;
}
stream.Write(data, offset, dataSize);
offset += dataSize;
}
Thread.Sleep(1000);
byte[] end = ASCIIEncoding.ASCII.GetBytes("end");
stream.Write(end, 0, end.Length);
client.Close();
Thread.Sleep(interval);
Console.WriteLine("iter=" + iteration.ToString());
}
I have an application in Xamarin forms that uses digital persona which I adapted successfully from this code of Android java
The problem is that this app returns only a byte[] array of a fingerprint, so i need to send fid xml to web service so i can compare validate fingers
but i dont know how
heres is the class that i use to parse stream from digital persona to array byte
public class UruImage
{
private static int IMAGE_HEIGHT = 290;
private static int IMAGE_WIDTH = 384;
private static int QUALITY = 75;
private static string LOG_TAG = "U.are.U-Image ";
// Raw data
private short unknown_00;
private byte[] unknown_07 = new byte[9];
private byte[] unknown_2E = new byte[18];
public short num_lines;
public short width;
public sbyte key_number;
public byte[] flags_num_lines = new byte[30];
public byte[] data;
// setter & getter
public void createFromData(ByteBuffer sData) //throws IOException
{
try
{
//tengo duda con lo indices en codigo java esta sData.GetShort(); sin index
sData.Order(ByteOrder.LittleEndian);
unknown_00 = sData.Short;
System.Console.WriteLine(LOG_TAG+" unknown_00: " + Convert.ToString(unknown_00));
width = sData.Short;
System.Console.WriteLine(LOG_TAG+ "width: " + Convert.ToString(width));
num_lines = sData.Short;
System.Console.WriteLine(LOG_TAG+ "num_lines: " + Convert.ToString(num_lines));
key_number = sData.Get();
System.Console.WriteLine(LOG_TAG+ "key_number: " + Convert.ToString(key_number));
sData.Get(unknown_07, 0, 9);
System.Console.WriteLine(LOG_TAG+ "unknown_07: " + bytesToHex(unknown_07));
sData.Get(flags_num_lines, 0, 30);
System.Console.WriteLine(LOG_TAG, "flags_num_lines: " + bytesToHex(flags_num_lines));
sData.Get(unknown_2E, 0, 18);
System.Console.WriteLine(LOG_TAG+ "unknown_2E: " + bytesToHex(unknown_2E));
data = new byte[(num_lines + 1) * width]; // extra line for decoding
sData.Get(data, 0, num_lines * width);
}
catch (Exception ex) {
System.Console.WriteLine(" createFromData " + ex.Message + " " + ex.ToString());
throw new Java.IO.IOException();
}
}
public Byte[] getImageBitmap()
{
try
{
int dataOffset = 0;
int[] pixels = new int[IMAGE_WIDTH * IMAGE_HEIGHT];
int i = 0;
for (int y = 0; y < IMAGE_HEIGHT; y++)
{
for (int x = 0; x < IMAGE_WIDTH; x++)
{
int gray = data[dataOffset + i] & 0xff;
pixels[i] = unchecked((int)0xff000000) | gray << 16 | (gray << 8) | gray;
i++;
}
}
Bitmap bm = Bitmap.CreateBitmap(pixels, IMAGE_WIDTH, IMAGE_HEIGHT, Bitmap.Config.Argb8888);
MemoryStream bs = new MemoryStream();
bm.Compress(Bitmap.CompressFormat.Jpeg, QUALITY, bs);
return bs.ToArray();
}
catch (System.Exception ex) {
System.Console.WriteLine("Get Image bitmap" + ex.Message + " " + ex.StackTrace);
}
return new MemoryStream().ToArray();
}
public byte[] getPgm()
{
return data;
}
public void invert()
{
try
{
int length = width * num_lines;
int i;
//duda con conversion de valor byte max_value = 0xFFFFFFFF;
byte max_value = unchecked((byte)0xFFFFFFFF);
for (i = 0; i < length; i++)
{
data[i] = (byte)(max_value - data[i]);
}
}
catch (System.Exception ex) {
System.Console.WriteLine("Invert "+ex.Message);
}
}
protected static char[] hexArray = "0123456789ABCDEF".ToCharArray();
private static String bytesToHex(byte[] bytes)
{
char[] hexChars = new char[bytes.Length * 2];
for (int j = 0; j < bytes.Length; j++)
{
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[(uint)v >> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}
I've encountered a problem during processing an image using c# , when I try to save my Image. the error is coming from system.drawing , which says parameter is invalid,here is my complete code , any ideas?!
thanks.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Drawing;
using System.Collections;
namespace ipp
{
class Program
{
public static byte[] ImageToArray(Image image,
System.Drawing.Imaging.ImageFormat format)
{
using (MemoryStream ms = new MemoryStream())
{
// Convert Image to byte[]
image.Save(ms, format);
byte[] imageBytes = ms.ToArray();
return imageBytes;
}
}
public static Image ArrayToImage(byte[] imageBytes)
{
using (var ms = new MemoryStream(imageBytes))
{
return Image.FromStream(ms);
}
}
static void Main(string[] args)
{
Console.WriteLine("Welcome, The Operation Has Begun.");
var img = new System.Drawing.Bitmap(#"E:\gray.bmp");
byte[] image1 = ImageToArray(img, System.Drawing.Imaging.ImageFormat.Bmp);
BitArray bits = new BitArray(image1);
byte[] subar0 = new byte[image1.Length];
byte[] subar1 = new byte[image1.Length];
byte[] subar2 = new byte[image1.Length];
byte[] subar3 = new byte[image1.Length];
byte[] subar4 = new byte[image1.Length];
byte[] subar5 = new byte[image1.Length];
byte[] subar6 = new byte[image1.Length];
byte[] subar7 = new byte[image1.Length];
byte[] subarf = new byte[image1.Length];
for (int i = 0; i < bits.Length; i += 8)
{
subar0[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 1; i < bits.Length; i += 8)
{
subar1[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 2; i < bits.Length; i += 8)
{
subar2[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 3; i < bits.Length; i += 8)
{
subar3[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 4; i <= bits.Length; i += 8)
{
subar4[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 5; i < bits.Length; i += 8)
{
subar5[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 6; i < bits.Length; i += 8)
{
subar6[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 7; i < bits.Length; i += 8)
{
subar7[i / 8] = Convert.ToByte(bits[i]);
}
for (int i = 0; i < image1.Length; i++)
{
subarf[i] = Convert.ToByte(128 * subar0[i] + 64 * subar1[i]);
}
Image fout = ArrayToImage(subarf);
fout.Save("E:\\merge.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
}
}
}
How do I iterate through a range of IP addresses provided by the user?
I'm flexible on the format, provided it allows all ranges to be specified. Perhaps something like the nmap-style:
'192.0.2.1' # one IP address
'192.0.2.0-31' # one block with 32 IP addresses.
'192.0.2-3.1-254' # two blocks with 254 IP addresses.
'0-255.0-255.0-255.0-255' # the whole IPv4 address space
For example, if the user entered 192.0.2-3.1-254, I would like to know how to generate a list of all the valid IP addresses in this range so that I could iterate through them.
For example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
namespace IpRanges
{
public class IPRange
{
public IPRange(string ipRange)
{
if (ipRange == null)
throw new ArgumentNullException();
if (!TryParseCIDRNotation(ipRange) && !TryParseSimpleRange(ipRange))
throw new ArgumentException();
}
public IEnumerable<IPAddress> GetAllIP()
{
int capacity = 1;
for (int i = 0; i < 4; i++)
capacity *= endIP[i] - beginIP[i] + 1;
List<IPAddress> ips = new List<IPAddress>(capacity);
for (int i0 = beginIP[0]; i0 <= endIP[0]; i0++)
{
for (int i1 = beginIP[1]; i1 <= endIP[1]; i1++)
{
for (int i2 = beginIP[2]; i2 <= endIP[2]; i2++)
{
for (int i3 = beginIP[3]; i3 <= endIP[3]; i3++)
{
ips.Add(new IPAddress(new byte[] { (byte)i0, (byte)i1, (byte)i2, (byte)i3 }));
}
}
}
}
return ips;
}
/// <summary>
/// Parse IP-range string in CIDR notation.
/// For example "12.15.0.0/16".
/// </summary>
/// <param name="ipRange"></param>
/// <returns></returns>
private bool TryParseCIDRNotation(string ipRange)
{
string[] x = ipRange.Split('/');
if (x.Length != 2)
return false;
byte bits = byte.Parse(x[1]);
uint ip = 0;
String[] ipParts0 = x[0].Split('.');
for (int i = 0; i < 4; i++)
{
ip = ip << 8;
ip += uint.Parse(ipParts0[i]);
}
byte shiftBits = (byte)(32 - bits);
uint ip1 = (ip >> shiftBits) << shiftBits;
if (ip1 != ip) // Check correct subnet address
return false;
uint ip2 = ip1 >> shiftBits;
for (int k = 0; k < shiftBits; k++)
{
ip2 = (ip2 << 1) + 1;
}
beginIP = new byte[4];
endIP = new byte[4];
for (int i = 0; i < 4; i++)
{
beginIP[i] = (byte) ((ip1 >> (3 - i) * 8) & 255);
endIP[i] = (byte)((ip2 >> (3 - i) * 8) & 255);
}
return true;
}
/// <summary>
/// Parse IP-range string "12.15-16.1-30.10-255"
/// </summary>
/// <param name="ipRange"></param>
/// <returns></returns>
private bool TryParseSimpleRange(string ipRange)
{
String[] ipParts = ipRange.Split('.');
beginIP = new byte[4];
endIP = new byte[4];
for (int i = 0; i < 4; i++)
{
string[] rangeParts = ipParts[i].Split('-');
if (rangeParts.Length < 1 || rangeParts.Length > 2)
return false;
beginIP[i] = byte.Parse(rangeParts[0]);
endIP[i] = (rangeParts.Length == 1) ? beginIP[i] : byte.Parse(rangeParts[1]);
}
return true;
}
private byte [] beginIP;
private byte [] endIP;
}
}
Check out the snippet here. Keep the credits in place if you use this please.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
/* ====================================================================================
C# IP address range finder helper class (C) Nahum Bazes
* Free for private & commercial use - no restriction applied, please leave credits.
* DO NOT REMOVE THIS COMMENT
* ==================================================================================== */
namespace IPAddressTools
{
public class RangeFinder
{
public IEnumerable<string> GetIPRange(IPAddress startIP,
IPAddress endIP)
{
uint sIP = ipToUint(startIP.GetAddressBytes());
uint eIP = ipToUint(endIP.GetAddressBytes());
while (sIP <= eIP)
{
yield return new IPAddress(reverseBytesArray(sIP)).ToString();
sIP++;
}
}
/* reverse byte order in array */
protected uint reverseBytesArray(uint ip)
{
byte[] bytes = BitConverter.GetBytes(ip);
bytes = bytes.Reverse().ToArray();
return (uint)BitConverter.ToInt32(bytes, 0);
}
/* Convert bytes array to 32 bit long value */
protected uint ipToUint(byte[] ipBytes)
{
ByteConverter bConvert = new ByteConverter();
uint ipUint = 0;
int shift = 24; // indicates number of bits left for shifting
foreach (byte b in ipBytes)
{
if (ipUint == 0)
{
ipUint = (uint)bConvert.ConvertTo(b, typeof(uint)) << shift;
shift -= 8;
continue;
}
if (shift >= 8)
ipUint += (uint)bConvert.ConvertTo(b, typeof(uint)) << shift;
else
ipUint += (uint)bConvert.ConvertTo(b, typeof(uint));
shift -= 8;
}
return ipUint;
}
}
}
I'm late to the game, but your question was mentioned in duplicate, so I just add the answer here. Using the IPAddressRange library, you can enumerate your IPs like that:
var start = IPAddress.Parse("192.168.0.2");
var end = IPAddress.Parse("192.168.0.254");
var range = new IPAddressRange(start, end);
foreach (var ip in range)
{
Console.WriteLine(ip);
}
The library also supports CIDR notation and range strings
I think this should do it.
static void TestFunc()
{
byte[,] range = ParseRange("192.0.2-5.14-28");
foreach (IPAddress addr in Enumerate(range))
{
Console.WriteLine(addr);
}
}
static byte[,] ParseRange(string str)
{
if (string.IsNullOrEmpty(str)) throw new ArgumentException("str");
string[] partStr = str.Split('.');
if (partStr.Length != 4) throw new FormatException();
byte[,] range = new byte[4, 2];
for (int i = 0; i < 4; i++)
{
string[] rangeStr = partStr[i].Split('-');
if (rangeStr.Length > 2) throw new FormatException();
range[i, 0] = byte.Parse(rangeStr[0]);
range[i, 1] = byte.Parse(rangeStr[Math.Min(rangeStr.Length - 1, 1)]);
// Remove this to allow ranges to wrap around.
// For example: 254-4 = 254, 255, 0, 1, 2, 3, 4
if (range[i, 1] < range[i, 0]) throw new FormatException();
}
return range;
}
static IEnumerable<IPAddress> Enumerate(byte[,] range)
{
if (range.GetLength(0) != 4) throw new ArgumentException("range");
if (range.GetLength(1) != 2) throw new ArgumentException("range");
for (byte a = range[0, 0]; a != (byte)(range[0, 1] + 1); a++)
{
for (byte b = range[1, 0]; b != (byte)(range[1, 1] + 1); b++)
{
for (byte c = range[2, 0]; c != (byte)(range[2, 1] + 1); c++)
{
for (byte d = range[3, 0]; d != (byte)(range[3, 1] + 1); d++)
{
yield return new IPAddress(new byte[] { a, b, c, d });
}
}
}
}
}
i have been writing a file server/client application in c# and it appeared to be working but then i realized the the stream was not being advanced and the client kept failing to receive from the server. so i checked wireshark and saw that my client was emitting TCPZeroWindow flagged packets. Any thoughts? Thanks.
Client :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace PortalClient
{
class Program
{
static string s1;
static byte[] data03;
static int int02;
static string str01;
static int length;
static IPEndPoint ipe01;
static TcpClient tcp01;
static FileStream s01;
static string ip01;
static string port01;
static string path01;
static byte[] data01;
static byte[] data02;
static byte[] data04;
static void Main(string[] args)
{
while (true)
{
label1:
{
try
{
string version = "V:1.1.4";
Console.Title = (" Portal Client " + version);
ConsoleColor ccolor1 = new ConsoleColor();
ccolor1 = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine();
Console.WriteLine(" PORTAL CLIENT " + version);
Console.WriteLine();
Console.ForegroundColor = ccolor1;
data01 = new byte[20];
data03 = new byte[100];
data04 = new byte[100];
Console.Write(" Enter IPv4 address of server : ");
ip01 = Console.ReadLine();
Console.Write(" Enter port to connect on : ");
port01 = Console.ReadLine();
ipe01 = new IPEndPoint(IPAddress.Parse(ip01), Convert.ToInt32(port01));
tcp01 = new TcpClient();
tcp01.ReceiveTimeout = 2500;
tcp01.NoDelay = true;
Console.WriteLine(" Connecting...");
tcp01.Connect(ipe01);
Console.WriteLine(" Done.");
tcp01.Client.Receive(data04, SocketFlags.None);
System.Threading.Thread.Sleep(100);
Console.WriteLine(" Server message : " + Encoding.UTF8.GetString(data04));
tcp01.Client.Receive(data03, SocketFlags.None);
System.Threading.Thread.Sleep(100);
Console.WriteLine(" File on server : " + Encoding.UTF8.GetString(data03));
tcp01.Client.Receive(data01, SocketFlags.None);
System.Threading.Thread.Sleep(100);
str01 = Encoding.UTF8.GetString(data01);
Console.WriteLine();
Console.WriteLine(" file size : " + str01);
Console.WriteLine();
Console.Write(" Enter the number you see above : ");
length = Convert.ToInt32(Console.ReadLine());
Console.Write(" Save file as : ");
path01 = Console.ReadLine();
for (int i = 1; i <= 9000; i++)
{
if (length % i == 0) { int02 = i; }
}
if (length < 9000) { int02 = length; }
int int03 = length / int02;
s01 = File.OpenWrite(#path01);
Console.WriteLine(" Receiving file from " + tcp01.Client.RemoteEndPoint.ToString() + "...");
tcp01.Client.Send(new byte[1], SocketFlags.None);
System.Threading.Thread.Sleep(1000);
for (int i = 0; i <= int03; i++)
{
bool bool1 = false;
data02 = new byte[int02];
int n = tcp01.Client.Receive(data02, 0, int02, SocketFlags.None);
while (n < int02)
{
Console.WriteLine(" Entered Loop ");
int int04 = int02 - n;
tcp01.Client.Send(Encoding.UTF8.GetBytes("2"), 0, 1, SocketFlags.None);
int int05 = 0;
byte[] data05 = new byte[int04];
if (int04 >= 1 && int04 <= 9) { s1 = int04 + "xxx"; }
if (int04 >= 10 && int04 <= 99) { s1 = int04 + "xx"; }
if (int04 >= 100 && int04 <= 999) { s1 = int04 + "x"; }
if (int04 >= 1000 && int04 <= 9000) { s1 = int04.ToString(); }
tcp01.Client.Send(Encoding.UTF8.GetBytes(s1), 0, 4, SocketFlags.None);
int05 = tcp01.Client.Receive(data05, 0, int04, SocketFlags.None);
n = n + int05;
s01.Write(data05, 0, int05);
bool1 = true;
}
if (bool1 == false)
{
s01.Write(data02, 0, int02);
tcp01.Client.Send(new byte[1], 0, 1, SocketFlags.None);
}
}
System.Threading.Thread.Sleep(1000);
s01.Close();
Console.WriteLine(" Received all data.");
Console.WriteLine(" Press enter to disconnect...");
Console.ReadLine();
tcp01.Client.Send(new byte[1], SocketFlags.None);
System.Threading.Thread.Sleep(1000);
Console.WriteLine(" Disconnecting...");
tcp01.Close();
Console.WriteLine(" Done.");
}
catch (Exception e)
{
Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString()); if (!(tcp01 == null)) { tcp01.Close(); } if (!(s01 == null)) { s01.Close(); goto label1; }
}
}
}
}
}
}
Server :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace PortalServer
{
class Program
{
static long length;
static int int03;
static int int02;
static TcpListener tcp01;
static TcpClient tcp02;
static FileStream s01;
static byte[] data01;
static byte[] data03;
static byte[] data04;
static byte[] data05;
static string str01;
static string str02;
static IPEndPoint ipe01;
static string port01;
static void Main(string[] args)
{
while (true)
{
label1:
try
{
string version = "V:1.1.4";
Console.Title = (" Portal Server " + version);
ConsoleColor ccolor1 = new ConsoleColor();
ccolor1 = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine();
Console.WriteLine(" PORTAL SERVER " + version);
Console.WriteLine();
Console.ForegroundColor = ccolor1;
Console.Write(" Enter port for connecting clients : ");
port01 = Console.ReadLine();
Console.Write(" Enter path of file to send : ");
str01 = Console.ReadLine();
ipe01 = new IPEndPoint(IPAddress.Any, Convert.ToInt32(port01));
tcp01 = new TcpListener(ipe01);
Console.Write(" Enter server message : ");
str02 = Console.ReadLine();
s01 = File.OpenRead(#str01);
length = s01.Length;
for (int i = 1; i <= 9000; i++)
{
if (length % i == 0) { int02 = i; }
}
if (length < 9000) { int02 = (int)length;}
int03 = (int)length / int02;
tcp01.Start();
Console.WriteLine(" Server started. Waiting for clients...");
tcp02 = tcp01.AcceptTcpClient();
tcp02.Client.NoDelay = true;
Console.WriteLine(" Client " + tcp02.Client.RemoteEndPoint.ToString() + " connected.");
data05 = Encoding.UTF8.GetBytes(str02);
tcp02.Client.Send(data05, SocketFlags.None);
System.Threading.Thread.Sleep(500);
data04 = Encoding.UTF8.GetBytes(str01);
tcp02.Client.Send(data04, SocketFlags.None);
System.Threading.Thread.Sleep(500);
data03 = Encoding.UTF8.GetBytes(length.ToString());
tcp02.Client.Send(data03, SocketFlags.None);
System.Threading.Thread.Sleep(500);
Console.WriteLine(" Waiting for response...");
tcp02.Client.Receive(new byte[1], SocketFlags.None);
Console.WriteLine(" Received response...");
Console.WriteLine(" Sending file to " + tcp02.Client.RemoteEndPoint.ToString() + "...");
System.Threading.Thread.Sleep(1);
for (int i = 0; i <= int03;i++ )
{
System.Threading.Thread.Sleep(30);
data01 = new byte[int02];
s01.Read(data01, 0, data01.Length);
int n = tcp02.Client.Send(data01, 0 ,data01.Length, SocketFlags.None);
if (n != int02) { throw new Exception("unable to write bytes, insufficient memory."); }
byte[] data07 = new byte[1];
while (true)
{
tcp02.Client.Receive(data07,0,1,SocketFlags.None);
if (Encoding.UTF8.GetString(data07) == "2")
{
byte[] data06 = new byte[4];
int b = tcp02.Client.Receive(data06, 0, 4, SocketFlags.None);
if (b != 4) { throw new Exception("ex1"); }
string s1 = Encoding.UTF8.GetString(data06);
s1 = s1.Replace("x", "");
int int05 = Convert.ToInt32(s1);
int int06 = int02 - int05;
byte[] data08 = new byte[int05];
Buffer.BlockCopy(data01, int06, data08, 0, int05);
tcp02.Client.Send(data08, 0, data08.Length, SocketFlags.None);
System.Threading.Thread.Sleep(30);
}
break;
}
}
System.Threading.Thread.Sleep(1000);
s01.Close();
Console.WriteLine(" All data sent.");
Console.WriteLine(" Waiting for terminate message...");
tcp02.Client.Receive(new byte[1], SocketFlags.None);
Console.WriteLine(" Received terminate message.");
tcp02.Close();
Console.WriteLine(" Stopping client and server.");
tcp01.Stop();
Console.WriteLine(" Done. Restarting.");
}
catch (Exception e)
{
Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString());
if (!(tcp02 == null)) { tcp02.Close(); }
if (!(tcp01 == null)) { tcp01.Stop(); goto label1; }
}
}
}
}
}
I've seen this happen if you are not emptying the network buffer correctly at the client end and the TCP window size is reduced to zero as a consequence.
This could be happening with your use of
tcp01.Client.Receive(data04, SocketFlags.None);
which may not be clearing the buffer sufficiently, see MSDN. You want to call Receive continuously until no further data is available.
If you would like a working example as a comparison please see here.
I used separate threads for the heavy lifting send / receive methods, increased buffer size, increased time between sends, made sure fragmentation was on. works like a charm now.
client :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.ComponentModel;
namespace PortalClient
{
class Program
{
static int partloop;
static bool bool1;
static byte[] data05;
static int int03;
static int int04;
static int int05;
static int numbytesreceived;
static BackgroundWorker bw1;
static int bytestoreceive;
static string s1;
static byte[] data03;
static int int02;
static string str01;
static int length;
static IPEndPoint ipe01;
static TcpClient tcp01;
static FileStream s01;
static string ip01;
static string port01;
static string path01;
static byte[] data01;
static byte[] data02;
static byte[] data04;
static void Main(string[] args)
{
newvoid();
}
static void newvoid()
{
while (true)
{
try
{
Console.Clear();
Console.WindowWidth = 95;
string version = "V:1.1.4";
Console.Title = (" Portal Client " + version);
ConsoleColor ccolor1 = new ConsoleColor();
ccolor1 = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine();
Console.WriteLine(#"
__________ __ .__ _________ .__ .__ __
\______ \____________/ |______ | | \_ ___ \| | |__| ____ _____/ |_
| ___/ _ \_ __ \ __\__ \ | | / \ \/| | | |/ __ \ / \ __\
| | ( <_> ) | \/| | / __ \| |__ \ \___| |_| \ ___/| | \ |
|____| \____/|__| |__| (____ /____/ \______ /____/__|\___ >___| /__|
\/ \/ \/ \/ " + version);
Console.WriteLine();
Console.ForegroundColor = ccolor1;
data01 = new byte[20];
data03 = new byte[100];
data04 = new byte[100];
Console.Write(" Enter IPv4 address of server : ");
ip01 = Console.ReadLine();
Console.Write(" Enter port to connect on : ");
port01 = Console.ReadLine();
ipe01 = new IPEndPoint(IPAddress.Parse(ip01), Convert.ToInt32(port01));
tcp01 = new TcpClient();
Console.WriteLine(" Connecting...");
tcp01.Connect(ipe01);
Console.WriteLine(" Done.");
tcp01.Client.Receive(data04, SocketFlags.None);
System.Threading.Thread.Sleep(100);
Console.WriteLine(" Server message : " + Encoding.UTF8.GetString(data04));
tcp01.Client.Receive(data03, SocketFlags.None);
System.Threading.Thread.Sleep(100);
Console.WriteLine(" File on server : " + Encoding.UTF8.GetString(data03));
tcp01.Client.Receive(data01, SocketFlags.None);
System.Threading.Thread.Sleep(100);
str01 = Encoding.UTF8.GetString(data01);
Console.WriteLine();
Console.WriteLine(" file size : " + str01);
Console.WriteLine();
Console.Write(" Enter the number you see above : ");
length = Convert.ToInt32(Console.ReadLine());
bytestoreceive = length;
Console.Write(" Save file as : ");
path01 = Console.ReadLine();
for (int i = 1; i <= 60000; i++)
{
if (length % i == 0) { int02 = i; }
}
if (length < 60000) { int02 = length; }
int03 = length / int02;
s01 = File.OpenWrite(#path01);
Console.WriteLine(" Receiving file from " + tcp01.Client.RemoteEndPoint.ToString() + "...");
tcp01.Client.Send(new byte[1], SocketFlags.None);
System.Threading.Thread.Sleep(1000);
while (bytestoreceive > 0)
{
bw1 = new BackgroundWorker();
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
bool1 = false;
numbytesreceived = 0;
data02 = new byte[int02];
bw1.RunWorkerAsync();
while (numbytesreceived == 0) { }
while (numbytesreceived < int02)
{
bw1 = new BackgroundWorker();
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
bool1 = true;
partloop += 1;
int04 = int02 - numbytesreceived;
tcp01.Client.Send(Encoding.UTF8.GetBytes("2"), 0, 1, SocketFlags.None);
int05 = 0;
data05 = new byte[int04];
if (int04 >= 1 && int04 <= 9) { s1 = int04 + "xxxx"; }
if (int04 >= 10 && int04 <= 99) { s1 = int04 + "xxx"; }
if (int04 >= 100 && int04 <= 999) { s1 = int04 + "xx"; }
if (int04 >= 1000 && int04 <= 9999) { s1 = int04 + "x"; }
if (int04 > 10000 && int04 <= 60000) { s1 = int04.ToString(); }
tcp01.Client.Send(Encoding.UTF8.GetBytes(s1), 0, 5, SocketFlags.None);
bw1.RunWorkerAsync();
while (int05 == 0) { }
if (int05 == 0) { throw new Exception("ex1"); }
numbytesreceived += int05;
bytestoreceive -= numbytesreceived;
s01.Write(data05, 0, data05.Length);
Console.WriteLine(" Received " + (length - bytestoreceive) + " / " + length + " bytes | P.B.R. loops: " + partloop.ToString());
Console.SetCursorPosition(0, Console.CursorTop - 1);
}
if (bool1 == false)
{
bytestoreceive -= numbytesreceived;
s01.Write(data02, 0, int02);
tcp01.Client.Send(new byte[1], 0, 1, SocketFlags.None);
Console.WriteLine(" Received " + (length - bytestoreceive) + " / " + length + " bytes | P.B.R. loops: " + partloop.ToString());
Console.SetCursorPosition(0, Console.CursorTop - 1);
}
}
Console.SetCursorPosition(0, Console.CursorTop + 1);
Console.WriteLine();
System.Threading.Thread.Sleep(500);
s01.Close();
Console.WriteLine(" Received all data.");
Console.WriteLine(" Press enter to disconnect...");
Console.ReadLine();
tcp01.Client.Send(new byte[1], SocketFlags.None);
System.Threading.Thread.Sleep(1000);
Console.WriteLine(" Disconnecting...");
tcp01.Close();
Console.WriteLine(" Done.");
}
catch (Exception e)
{
Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString());
if (!(tcp01 == null)) { tcp01.Close(); }
if (!(s01 == null)) { s01.Close(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
newvoid();
}
}
}
static void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
bw1.Dispose();
}
catch (Exception e1)
{
Console.WriteLine(" Error! : " + e1.Message.ToString() + " - " + e1.Data.ToString() + " - " + e1.TargetSite.ToString());
if (!(tcp01 == null)) { tcp01.Close(); }
if (!(s01 == null)) { s01.Close(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
newvoid();
}
}
static void bw1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (bool1 == false)
{
numbytesreceived = tcp01.Client.Receive(data02, 0, int02, SocketFlags.None);
}
if (bool1 == true)
{
int05 = tcp01.Client.Receive(data05, 0, int04, SocketFlags.None);
}
}
catch (Exception e2)
{
Console.WriteLine(" Error! : " + e2.Message.ToString() + " - " + e2.Data.ToString() + " - " + e2.TargetSite.ToString());
if (!(tcp01 == null)) { tcp01.Close(); }
if (!(s01 == null)) { s01.Close(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
newvoid();
}
}
}
}
server:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.ComponentModel;
namespace PortalServer
{
class Program
{
static int bytesresent;
static BackgroundWorker bw1;
static int int06;
static int int05;
static string string01;
static int bytesCreceived;
static byte[] data06;
static byte[] data07;
static byte[] data08;
static int bytessent;
static bool bool1;
static int bytestosend;
static long length;
static int int03;
static int int02;
static TcpListener tcp01;
static TcpClient tcp02;
static FileStream s01;
static byte[] data01;
static byte[] data03;
static byte[] data04;
static byte[] data05;
static string str01;
static string str02;
static IPEndPoint ipe01;
static string port01;
static void Main(string[] args)
{
newvoid();
}
static void newvoid()
{
while (true)
{
try
{
Console.Clear();
Console.WindowWidth = 95;
string version = "V:1.1.4";
Console.Title = (" Portal Server " + version);
ConsoleColor ccolor1 = new ConsoleColor();
ccolor1 = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine();
Console.WriteLine(#"
__________ __ .__ _________
\______ \____________/ |______ | | / _____/ ______________ __ ___________
| ___/ _ \_ __ \ __\__ \ | | \_____ \_/ __ \_ __ \ \/ // __ \_ __ \
| | ( <_> ) | \/| | / __ \| |__ / \ ___/| | \/\ /\ ___/| | \/
|____| \____/|__| |__| (____ /____/ /_______ /\___ >__| \_/ \___ >__|
\/ \/ \/ \/ " + version);
Console.WriteLine();
Console.ForegroundColor = ccolor1;
Console.Write(" Enter port for connecting clients : ");
port01 = Console.ReadLine();
Console.Write(" Enter path of file to send : ");
str01 = Console.ReadLine();
ipe01 = new IPEndPoint(IPAddress.Any, Convert.ToInt32(port01));
tcp01 = new TcpListener(ipe01);
Console.Write(" Enter server message : ");
str02 = Console.ReadLine();
s01 = File.OpenRead(#str01);
length = s01.Length;
bytestosend = (int)length;
for (int i = 1; i <= 60000; i++)
{
if (length % i == 0) { int02 = i; }
}
if (length < 60000) { int02 = (int)length; }
int03 = (int)length / int02;
tcp01.Start();
Console.WriteLine(" Server started. Waiting for clients...");
tcp02 = tcp01.AcceptTcpClient();
Console.WriteLine(" Client " + tcp02.Client.RemoteEndPoint.ToString() + " connected.");
data05 = Encoding.UTF8.GetBytes(str02);
tcp02.Client.Send(data05, SocketFlags.None);
System.Threading.Thread.Sleep(500);
data04 = Encoding.UTF8.GetBytes(str01);
tcp02.Client.Send(data04, SocketFlags.None);
System.Threading.Thread.Sleep(500);
data03 = Encoding.UTF8.GetBytes(length.ToString());
tcp02.Client.Send(data03, SocketFlags.None);
System.Threading.Thread.Sleep(500);
Console.WriteLine(" Waiting for response...");
tcp02.Client.Receive(new byte[1], SocketFlags.None);
Console.WriteLine(" Received response...");
Console.WriteLine(" Sending file to " + tcp02.Client.RemoteEndPoint.ToString() + "...");
System.Threading.Thread.Sleep(1);
while (bytestosend > 0)
{
System.Threading.Thread.Sleep(50);
bool1 = false;
bytessent = 0;
bw1 = new BackgroundWorker();
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
data01 = new byte[int02];
s01.Read(data01, 0, data01.Length);
bw1.RunWorkerAsync();
while (bytessent == 0) { }
if (bytessent != int02) { throw new Exception("unable to write bytes, insufficient memory."); }
while (true)
{
data07 = new byte[1];
tcp02.Client.Receive(data07, 0, 1, SocketFlags.None);
if (Encoding.UTF8.GetString(data07) == "2")
{
bytesresent = 0;
bool1 = true;
bw1 = new BackgroundWorker();
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw1_RunWorkerCompleted);
data06 = new byte[5];
bytesCreceived = tcp02.Client.Receive(data06, 0, 5, SocketFlags.None);
if (bytesCreceived != 5) { throw new Exception("invalid client response."); }
string01 = Encoding.UTF8.GetString(data06);
string01 = string01.Replace("x", "");
int05 = Convert.ToInt32(string01);
int06 = int02 - int05;
bytestosend -= int05;
data08 = new byte[int05];
Buffer.BlockCopy(data01, int06, data08, 0, int05);
bw1.RunWorkerAsync();
while (bytesresent == 0) { }
Console.WriteLine(" Sent " + (length - bytestosend) + " / " + length + " bytes");
Console.SetCursorPosition(0, Console.CursorTop - 1);
System.Threading.Thread.Sleep(50);
}
if (Encoding.UTF8.GetString(data07) != "2")
{
bool1 = false;
bytestosend -= bytessent;
Console.WriteLine(" Sent " + (length - bytestosend) + " / " + length + " bytes");
Console.SetCursorPosition(0, Console.CursorTop - 1);
break;
}
}
}
Console.SetCursorPosition(0, Console.CursorTop + 1);
Console.WriteLine();
System.Threading.Thread.Sleep(500);
s01.Close();
Console.WriteLine(" All data sent.");
Console.WriteLine(" Waiting for terminate message...");
tcp02.Client.Receive(new byte[1], SocketFlags.None);
Console.WriteLine(" Received terminate message.");
tcp02.Close();
Console.WriteLine(" Stopping client and server.");
tcp01.Stop();
Console.WriteLine(" Done. Press enter to continue...");
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(" Error! : " + e.Message.ToString() + " - " + e.Data.ToString() + " - " + e.TargetSite.ToString());
if (!(tcp02 == null)) { tcp02.Close(); }
if (!(tcp01 == null)) { tcp01.Stop(); }
if (!(s01 == null)) { s01.Close(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
newvoid();
}
}
}
static void bw1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
bw1.Dispose();
}
catch (Exception e1)
{
Console.WriteLine(" Error! : " + e1.Message.ToString() + " - " + e1.Data.ToString() + " - " + e1.TargetSite.ToString());
if (!(tcp02 == null)) { tcp02.Close(); }
if (!(tcp01 == null)) { tcp01.Stop(); }
if (!(s01 == null)) { s01.Close(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
newvoid();
}
}
static void bw1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (bool1 == false)
{
bytessent = tcp02.Client.Send(data01, 0, data01.Length, SocketFlags.None);
}
if (bool1 == true)
{
bytesresent = tcp02.Client.Send(data08, 0, data08.Length, SocketFlags.None);
}
}
catch(Exception e2)
{
Console.WriteLine(" Error! : " + e2.Message.ToString() + " - " + e2.Data.ToString() + " - " + e2.TargetSite.ToString());
if (!(tcp02 == null)) { tcp02.Close(); }
if (!(tcp01 == null)) { tcp01.Stop(); }
Console.Write(" Press enter to continue..."); Console.ReadLine();
if (!(s01 == null)) { s01.Close(); }
newvoid();
}
}
}
}