|
Hello,
i have a problem with following code:
byte[] Buffer = new byte[clientConnection.ReceiveBufferSize-1];
int i = clientConnection.GetStream().Read(Buffer, 0, clientConnection.ReceiveBufferSize-1);
String result = System.Text.Encoding.ASCII.GetString(Buffer,0,clientConnection.ReceiveBufferSize-1);
Console.WriteLine("INCOMING PACKAGE: " + result);
So there i want to read something from a TCPClient-Stream, but it doesnt work really. Yes i get my data, but with the data a lot of "space bars". Well my string should look like this:
"INCOMING PACKAGE: Hello World!" but it looks like "INCOMING PACKAGE: Hello World! ..." (Buffer Length was over 8000 Bytes long)
So how to solve this problem? What do i wrong?
|
|
|
|
|
softwarejaeger wrote: String result = System.Text.Encoding.ASCII.GetString(Buffer,0,clientConnection.ReceiveBufferSize-1);
Just do:
String result = System.Text.Encoding.ASCII.GetString(Buffer); It will figure out the length.
|
|
|
|
|
Yes, but that doesn't solve my problem, i get a string with 8191 characters, and the most of them are "empty"
|
|
|
|
|
softwarejaeger wrote: and the most of them are "empty"
Are they 'empty' as in whitespace, or 'empty' as in \0? If it is the latter, you are dealing with binary data, and you need to parse/delimit it yourself first.
|
|
|
|
|
You're over-analyzing. He wants a byte array that contains his data, which isn't necessarily 8k big. I think the solution I provided is what he wants.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
i had found the failure... now it works ...
|
|
|
|
|
byte[] Buffer = null;
int buffSize = clientConnection.ReceiveBufferSize-1;
int i = clientConnection.GetStream().Read(Buffer, 0, buffSize);
String result = System.Text.Encoding.ASCII.GetString(Buffer);
Console.WriteLine("INCOMING PACKAGE: " + result);
The byte array will never be larger than the amount of data returned, so you can convert it to a string in it's entirety without worrying about how big it is and how much actual data it contains.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
John Simmons / outlaw programmer wrote:
//do NOT allocate the array
byte[] Buffer = null;
That's just wrong dude! You never create it! Your code WILL FAIL!
FileStream::Read in Reflector.
public override int Read([In, Out] byte[] array, int offset, int count)
{
if (array == null)
{
throw new ArgumentNullException("array", Environment.GetResourceString("ArgumentNull_Buffer"));
}
|
|
|
|
|
No, it won't, and I've got code to prove it. The function I'm calling returns an allocated array. That means I don't have to allocate it myself. However, I do have to initialize it to null so that it works on the first call.
BinaryReader reader = null;
FileStream streamSource = null;
byte[] fileBytes = null;
try
{
streamSource = new FileStream("c:\\myfile.dat", FileMode.Open, FileAccess.Read, FileShare.None);
reader = new BinaryReader(streamSource);
do
{
fileBytes = reader.ReadBytes(65536);
if (fileBytes.Length != 0)
{
}
} while (fileBytes.Length != 0);
}
catch (Exception ex)
{
if (ex != null) {}
this.m_lastError = 33;
}
finally
{
if (reader != null)
{
reader.Close();
}
if (streamSource != null)
{
streamSource.Close();
}
}
In the example I posted, fileBytes will contain one of three thins - a 65536-byte array, and n-byte array (comprised of the last bit of data in the file), or a 0-byte array, indicating no data read from the file (EOF).
In each of those three cases, the array is exactly the length of the retrieved data, and the array is never "null".
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
modified on Thursday, August 7, 2008 12:12 PM
|
|
|
|
|
BinaryReader.ReadBytes and Stream.Read are two very different things.
Please get some basic understanding of C# - a variable can't magically switch from null to a (array) reference. The only ways a local variable can change value is
a) you assign something to it (e.g. "fileBytes = reader.ReadBytes(65536);")
b) you pass it by reference (with an explicit "ref" at the call site)
c) calling a method on a value type variable can change that variable's value (for value types "a.X()" basically does "X(ref a)")
So a method call like "Read(Buffer)" can NEVER change the value of Buffer - it can change the contents Buffer points to, but it cannot change Buffer to point to a different array.
And you don't need to initialize with null "so it works on the first call". You'll get a compiler error when trying to use an uninitialized variable. This is C#, not C++.
Edit: and I forgot: your BinaryReader code will always try to read the full 65536 bytes, or until end of stream. This is fine for files; but reading a network stream, you usually need to process an incoming request immediately and not when the 65536 bytes are full or the client disconnects.
modified on Thursday, August 7, 2008 12:36 PM
|
|
|
|
|
ReceiveBufferSize is the size of the socket's internal receive buffer. It has nothing to do with your "Buffer" or the received data size.
byte[] Buffer = new byte[4096];
int i = clientConnection.GetStream().Read(Buffer, 0, Buffer.Length);
String result = System.Text.Encoding.ASCII.GetString(Buffer,0,i);
Console.WriteLine("INCOMING PACKAGE: " + result);
Warning: a TCP stream may fragment the data, so a Read call may only read part of a "package".
Usually, you'll need to prefix the data with the size you need, or use some kind of string terminator. The easiest solution would be to terminate your "packages" using newlines. Then you just use a StreamReader.
StreamReader r = new StreamReader(clientConnection.GetStream());
String result = r.ReadLine();
Console.WriteLine("INCOMING PACKAGE: " + result);
|
|
|
|
|
I have a function that convert numbers to letter.
For example when i give 20 as parameter to these method it will return Twenty.
Anyway what i am looking for is: can i use this methods in Excel sheets as a macros or something else??
What i need is that when the user open an excel file and type 3 in column 1 i want to write the letter value i the seconde column automatically?
Do someone have any idea????
dghdfghdfghdfghdgh
|
|
|
|
|
|
Hello All,
I'm going to ask a question that I understand my be far too vague to answer so I'm hoping for just a general idea of where to go, nothing more.
I'm capturing raw packets via C# which works great for me so far. What I intend to do is parse packets that contain POP3 e-mails and I'm also planning on parsing web-based e-mail clients (such as hotmail and others by parsing the html code) so that I can write some filters / spam features to my program. Unfortunately, I have very little clue as to how to handle this kind of information when it's encrypted with SSL.
I know you need to retrieve particular information regarding the handshake, for example, and key/pair values depending on what kind of SSL is being used (my understanding is that there is no one set SSL method) but that's all I've been able to determine so far.
I just need a pointer in the right direction as to how to decrypt SSL packets so that I can parse those as well.
Feel free to point out any other flaws you may see.
Thank you everyone.
|
|
|
|
|
Spiro Floropoulos wrote: I just need a pointer in the right direction as to how to decrypt SSL packets so that I can parse those as well.
If you could do that, SSL would be a useless technology. Try again
|
|
|
|
|
Well how does a program like Microsoft Outlook parse SSL e-mails when it receives them then? Or how does a browser handle SSL based information? There is obviously a decryption method for these. Are there not libraries out there that handle this kind of information? I think even Winshark is able to handle some SSL decryptions.
|
|
|
|
|
Thats because it creates the SSL connection to the server... Did you look at SSLStream and try simulate it? I guess not. Do you know how SSL works? The mail program knows nothing about SSL encryption/decryption. Again I will refer you to SSLStream .
Spiro Floropoulos wrote: I think even Winshark is able to handle some SSL decryptions.
Unless you are Chuck Norris, your thinking does not mean anything. Either it works or it does not.
|
|
|
|
|
Spiro Floropoulos wrote: I think even Winshark is able to handle some SSL decryptions.
That's WireShark btw...
|
|
|
|
|
Yes, sorry Wireshark.
I see, so instead of worrying about decrypting SSL packets (I understand why being able to decrypt SSL so easily would totally defeat the purpose of having SSL) I should instead focus on perhaps creating a proxy or relay server to grab POP3 e-mails.
|
|
|
|
|
Spiro Floropoulos wrote: I see, so instead of worrying about decrypting SSL packets (I understand why being able to decrypt SSL so easily would totally defeat the purpose of having SSL) I should instead focus on perhaps creating a proxy or relay server to grab POP3 e-mails.
That's an excellent idea
|
|
|
|
|
You may want to look at an open source project called POPFile. I think it is on SourceForge.
|
|
|
|
|
Hello,
in my application, i create a lot of classes, which i only use "for the moment", what happens with the class, when i don't need them anymore? is it ok to delete the class with "myClass = null" or what must i do, to delete the class from my memory, because i think its a big amount of classes in my application, which i use only for one task and don't use it anymore.
i'm looking forward to hear from you
thanks
|
|
|
|
|
You don't need to do anything.
C# is a garbage collected language, which means when you have finished using an object, it will automatically be marked for garbage collection and removed from memory on the next pass.
You don't need to set it to null or anything, it will automatically be recognised as not in use once it passes out of scope.
(If you allocate _unmanaged_ resources in your class, like file handles, or database connections, then you should implement the dispose[^] pattern in the class to ensure they get cleaned up promptly)
Simon
|
|
|
|
|
Technically, you're working on "objects", not "classes". Terminology is important.
I believe that when the object goes out of scope, the garbage collector will eventually pick it up and free the memory.
Many of the .Net framework objects have a Dispose() method, so when you're done, you can call that. If you want to dispose your own objects, you have to derive from IDisposable , and override a few methods.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
What you mean is that you create instances of the classes, i.e. object with that class as type.
Unless you are using unmanaged resources in your objects, you don't have to do anything at all. When the object isn't used any more, it will eventually get removed by the garbage collector.
You can set the reference to null if it's a variable that you are keeping, i.e. a member variable in an object that you will keep using (for example a member variable in a Form).
If it's a local variable that will go out of scope, you don't need to remove the reference. Setting the variable to null in that case will not affect the memory management at all.
Creating objects that is used for a very short time is very common in .NET. Take for example a statement like this (items and pages are integers):
string x = "There were " + items + " items in " + pages + " pages.";
This will create five short lived objects (two boxed integers, one object array and two strings containing the string representations of the integers) which will be up for garbage collection once the string is created.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|