|
Your code shows some misunderstandings: the inner while loop will start many threads in very short intervals - likely long before any of the already started threads has finished its work. A short wait time in between may be appropriate.
Your comment
// Do works ... Consider that classes are shared between clients and servers
// so classes are Invoked ... is unintellegible. What is the problem you want to solve with that? And why do you think your solution does so?
Also, I don't see any use of int i = 0 .
The code may become better readable when you refactor the bodies of the threads into functions.
Also note that an exception in a thread may crash your program if you don't handle it inside that thread.
|
|
|
|
|
Hi, i have removed useless code.
Now you can see, with Thread.Sleep(1000) i lose a lot of packets (more time, more loss. ~1000sent, ~40received). The above sketch code is the receiver.
What can I do to avoid losing packets?
Yes i know about handle inside threads
Hope you can help me, Thanks
|
|
|
|
|
You put the thread that is receiving data to sleep for 1 second upon the receipt of data and you wonder why you're losing packets?
|
|
|
|
|
Yes, i lose packets anyway.. Without .Sleep i get 1000sent/800received.
Client and server are in the same pc actually
|
|
|
|
|
You should never have a Sleep anywhere in your network code.
Also, you're receive code seems to think that when a client sends a message, you get the entire message in one go without regard to a message potentially being split up into multiple Reads. You Read however many bytes are told you received and deserialize them, even if the message is incomplete. The next read will also fail to deserialize properly because now you don't have the first part of the message but you have the trailing end of it, not a complete message.
Your losing "messages", not packets. Those are two totally separate concepts and cannot be used interchangeably.
It would seems that your client and server code has no method of delineating messages from each other. Where in the stream of bytes read can your code determine that a new message has started? You should only try to deserialize the data when you are sure you have a complete message in the buffer. That's what you have to implement.
|
|
|
|
|
> You should never have a Sleep anywhere in your network code
Using Sleep only for the example to emulate a computational delay
You are right, i'm confusing packets and messages sorry and thank.
I missed to say that: if i send messages slowly, the receiver can handle all messages without any issues.
The problem is when i send more message than the receiver can handle. Maybe i'm mad, but i won't lose messages!
The strange thing is, if i send a 2KB message over the network, the message have to be splitted, right? Cause of MTU. i should receive 2 messages? I still receive one, no crashes. So i need clarity.
As i said in the main post, i get crash only if i send a lot of messages much quickly
modified 10-May-17 11:57am.
|
|
|
|
|
If a message exceed the data payload size of a packet on a pipe, it is broken into multiple packets. You cannot attempt to deserialize the data until all packets for the message have been received. You're current code doesn't do that.
Your server code has no method of telling a client that 1) data is coming and this is how many bytes to expect (header), the data itself, and a checksum to validate that the data is OK (if necessary). These things do not have to be separate messages.
The client should not attempt to deserialize the data unless it 1) saw the message header and knows how many bytes to expect, 2) captured the data in the buffer, and checksummed the data to make sure it was OK (if necessary).
If the client receives anything it doesn't recognize or too few/many bytes, it should not attempt to deserialize the data. It should (optionally) tell the server to resend the data and go back to waiting for a new header.
|
|
|
|
|
So you suggest to send 4 bytes that's the length of the message and a some bytes for the checksum, which protocol you suggest for the cksum? md5? there are something lighter?
I will do that (after fix message loss)
Any ideas to avoid loss of messages?
thanks for your time guys
|
|
|
|
|
Normally, I would start with a message delineation marker, say 3 bytes of 'F0', then a 32-bit message length, then then message. The checksum is options, but if it's used, that would be supplied after the message length and before the message. Typically, the message is going to be a variable length so it should show up last.
|Start of Message|Length in bytes|CheckSum|Message bytes...|
| F0 F0 F0 | 00 00 00 1A | F6 |data bytes... |
You don't get it. This may just fix your message loss because as your code stands right now, since you don't have any way of knowing when a message begins and ends, you have no way of knowing if the data you deserialize is valid! You could be deserializing the end bytes from the last message combined with the beginning bytes of the next message thinking it's valid when it's not.
|
|
|
|
|
Problem solved .. you were right when you said "you're receive code seems to think that when a client sends a message, you get the entire message in one"
Now everything works perfectly
public static void CopyStream(Stream input, Stream output, int MaxLength)
{
int read, totalread = 0;
byte[] buffer = new byte[81920];
while (totalread < MaxLength)
{
read = input.Read(buffer, 0,
(
((MaxLength - totalread) < buffer.Length) ?
(MaxLength - totalread) :
buffer.Length
)
);
if (read == 0) break;
totalread += read;
output.Write(buffer, 0, read);
}
}
modified 12-May-17 10:05am.
|
|
|
|
|
The usual "pattern" is that the client "asks" for data that the server then sends.
You seem to be arbitrarily shoving data at clients and then expecting them to somehow keep up.
Ever been force fed without choking?
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
I need to send data arbitrarily over the time or period (like 20times per second), not ask-resp. I could switch to UDP, don't know yet.
> Ever been force fed without choking?
Maybe handle X requests, then drop the extras
|
|
|
|
|
You've got a bigger problem with UDP. Your client must be tolerant of lost or corrupted data. UDP does not guarantee delivery of any packet nor does it even guarantee the order in which they arrive!
|
|
|
|
|
Yes yes i know, udp maybe in the future. Now let's work on tcp
|
|
|
|
|
I have a submenu on master page which has two webforms(candidate and add new) in it.when I click on candidate page and do my work. then if I have to go to add new page then I have to click on menu and click on add new page. Is there any way if i click on add new page there should be link label on top of page that shows candidate page. So that if I click that It should take me to a candidate page.
It is an emergency any help would be appreciated
|
|
|
|
|
Member 13189268 wrote: It is an emergency In what way? But as to your main question, you can put links in any page you wish in order to switch from one to another.
|
|
|
|
|
Member 13189268 wrote: It is an emergency
Have you checked the airways? Pulse? Bleeding?
Do you require the Police, Ambulance, or Fire services?
Because I've checked here, and nobody can see an emergency anywhere...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
i have a small confusion that when we compare like == or equal function then both does the same job. u have a very basic question here.
see my program full code
int x = 1000;
int y = 1000;
if (x == y)
Console.WriteLine("Value is same");
else
Console.WriteLine("Value is not same");
if (x.Equals(y))
Console.WriteLine("Value is same");
else
Console.WriteLine("Value is not same");
if (object.ReferenceEquals(x,y))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
string s1 = "Hello";
string s2 = "Hello";
if (s1 == s2)
Console.WriteLine("Value is same");
else
Console.WriteLine("Value is not same");
if (s1.Equals(s2))
Console.WriteLine("Value is same");
else
Console.WriteLine("Value is not same");
if (object.ReferenceEquals(s1, s2))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
i know that this kind of checking if (x == y) is based on value but when i use Equals function then i saw Equals is also work like == operator....am i right ?
how to check the reference ?
if (object.ReferenceEquals(x,y))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
i saw in this case else portion execute........why because different memory is allocated for x and y ?
see more for string reference check
if (object.ReferenceEquals(s1, s2))
Console.WriteLine("ref is same");
else
Console.WriteLine("ref is not same");
in this scenario s1 and s2 ref found same which is not clear to me because s1 and s2 ref should be different because two are different variable so how s1 and s2 reference check become same?
i like to know what are the best process to know value and reference is same or not whatever data type we use may be string or integer or float etc. please some one help me to understand this.
one guy said string in dotnet is interned. what is the meaning of In .NET strings are interned ? interned or internal is same ?
please discuss with a example just to clarify the meaning of string is interned in dotnet.
thanks
tbhattacharjee
|
|
|
|
|
|
What gets me is that he's been here for 13 years, and he still knows nothing about development, and can't use Google ...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
"Artificial" intelligence.
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
|
Message Closed
modified 9-May-17 6:10am.
|
|
|
|
|
Can any one suggest a better way to identify the redundant code in a class using c# code.
For Example:
Method1() body had some other method calls
Method2() body had few more other method calls including the methods in Method1().
In this case i have to identify that the method1() had the redundant code. I need to comment that.
Suggest me the best answer.
|
|
|
|
|
The only way to be sure is to understand exactly what the code is doing. There may be good logical reasons why some code is duplicated in a program.
|
|
|
|