[ Aleksandrov @ 19.08.2011. 11:27 ] @
Napravio sam u c# jednostavnu serversku i klijentsku aplikaciju.

Aplikacije rade na sledeci nacin:
Klijentska aplikacija na svakih 100mS proziva server.
Server ispisuje podatke koje je dobio od klijenta i kao odgovor posalje niz od 17000 bajtova.
Klijent proverava da li je 15395 bajt tog niza == 14
Ako jeste ispise OK.
Ako nije povecava brojac greske.

E sad kad pustim obe aplikacije, softver jedno vreme (5 minuta) radi dobro, a potom krene da se povecava brojac greske, tj. 15395 bajt niza postaje 0. Nakon sto se prvi put pojavi greska, njena frekvencija pojavljivanja raste.
Prilikom testiranja, pokrenuo sam obe aplikacije na istom racunaru.

Kako da resim problem, da se ne pojavljuju greske?
Da li je mozda problem u kolicini bajtova koji se salju od strane servera?

hvala

Server:
Code:

            TcpListener TCPIPServer = new TcpListener(IPAddress.Any, 12200);
            TCPIPServer.Start();
            bool BrokenConn= false;
            Byte[] byteComData = new Byte[17000];
            string strComData = null;
            while (true)
            {
                int i = 0;
                BrokenConn= false;
                TcpClient TCPIPKlijent = TCPIPServer.AcceptTcpClient();
                NetworkStream stream = TCPIPKlijent.GetStream();
                while (BrokenConn== false)
                {
                    i = stream.Read(byteComData, 0, byteComData.Length);
                    strComData = System.Text.Encoding.ASCII.GetString(byteComData, 0, i);
                    strComData = strComData.TrimEnd('\n', '\r');
                    string Parametar = (strComData.Substring(1, strComData.Length - 1)).TrimEnd('\n', '\r');
                    Console.WriteLine(Parametar);
                    byte[] tmpInt = new byte[17000];
                    tmpInt[0] = 56;
                    tmpInt[1] = 78;
                    tmpInt[2] = 122;
                    tmpInt[3] = 166;
                    tmpInt[15395] = 14;
                    stream.Write(tmpInt, 0, 16200);
                }
            }



Code:


            TcpClient simpleTcp = null;
            NetworkStream tcpStream = null;
            int bytesToRead = 0, nextReadCount, rc;
            int bufferSize = 17000;
            IPAddress MyIPAddress;
            int BrojGresaka=0;
            IPAddress.TryParse("192.168.1.11", out MyIPAddress);
            byte[] sendBuffer = new byte[bufferSize], receiveBuffer = new byte[bufferSize], byteCount;
            // Create the client and indicate the server to connect to
            Console.WriteLine("TCP client: Creating the client and indicate the server to connect to...");
            simpleTcp = new TcpClient("192.168.1.11", 12200);

            // Retrieve the NetworkStream so we can do Read and Write
            Console.WriteLine("TCP client: Retrieving the NetworkStream so we can do Read and Write...");
            tcpStream = simpleTcp.GetStream();
            while (true)
            {
                tcpStream.Write(Encoding.ASCII.GetBytes("D63449061600"), 0, 12);
                rc = tcpStream.Read(receiveBuffer, 0, bufferSize);
                Console.WriteLine(receiveBuffer[15395]);
                if (receiveBuffer[15395] == 14)
                {
                    Console.WriteLine(DateTime.Now.ToString() + " OK!, Broj gresaka:" + BrojGresaka.ToString());
                }
                else
                {
                    BrojGresaka++;
                    Console.WriteLine("Greska br:" + BrojGresaka.ToString());
                }
                Thread.Sleep(100);
            }

[ Mihajlo Cvetanović @ 19.08.2011. 14:34 ] @
Funkcija NetworkStream.Read ne garantuje da će pročitati onoliko bajtova koliko se traži. Moraš da proveriš povratnu vrednost funkcije da bi utvrdio da li si pročitao sve bajtove. Ako nisi onda moraš da nastaviš da čitaš. Ovo moraš da izmeniš i u klijentskom i u serverskom kodu. Pozivaj Read u petlji, a rc dodaj na neki ofset, pa kad taj ofset dostigne očekivanu veličinu bafera onda si završio. Taj ofset treba istovremeno da bude i jedan od parametara funkcije Read (tamo gde ti trenutno na oba mesta stoji 0).
[ Aleksandrov @ 20.08.2011. 09:59 ] @
e hvala. Problem resen.
Sto se tice serverskog koda, pretpostavljam da ipak postoji neki minimum u kolicini podataka koji netowrkStream.Read moze da garantuje a koji je odredjen velicinom jednog TCP paketa.
[ Boris B. @ 22.08.2011. 08:34 ] @
@Aleksandrov: Ne, ne postoji nikakav garantovani minimum. TCP/IP frame uopšte ne mora da bude pun (iako je preporučeno, pogledaj MTU), a tu je još i hardverski bafer od ethernet kartice koji efikasno krije veličinu paketa, tako da možeš da dobiješ i jedan bajt.

Btw, čisto iz radoznalosti, šta je #15395 bajt i zašto baš mora da bude 14?