Avatar billede slapstick Nybegynder
12. november 2008 - 14:32 Der er 10 kommentarer og
1 løsning

tcpclient - modtager ikke al data..

jeg bruger tcp client til at lave en http connection til feks www.dr.dk
men jeg får ikke al det data tilbage som jeg burde..
hvis jeg laver en:
GET /Nyheder/Indland/2008/11/12/132040.htm HTTP/1.1\r\nHost: www.dr.dk\r\n\r\n
så får jeg kun det her tilbage:
Age: 38       
Date: Wed, 12 Nov 2008 13:31:06 GMT
Cache-Control: max-age=120      ,public
Content-Length: 35963   
Connection: Keep-Alive
Via: NS-CACHE-8.0: NS11
ETag: "KXMEOCGOGGMKWYTVY"
Server: Microsoft-IIS/5.0
X-Powered-By: ASP.NET
Content-Type: text/html; charset=iso-8859-1


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" la

jeg bruger det her kode til at læse modtagen data fra serveren:

public string GetServerResponse()
        {
            int streamSize;
            string returnValue = "";
            byte[] readBuffer;
            NetworkStream networkStream = this.GetStream();
            readBuffer = new byte[this.ReceiveBufferSize];
            streamSize = networkStream.Read(readBuffer, 0, readBuffer.Length);
            if (streamSize == 0)
            {
                return returnValue;
            }
            else
            {
                ASCIIEncoding asciiEncoder = new ASCIIEncoding();
                returnValue = asciiEncoder.GetString(readBuffer);
                return returnValue;
            }

        }
Avatar billede Syska Mester
12. november 2008 - 14:42 #1
hvor stor er din buffer ? Kunne måske være der problemet er ...
Avatar billede slapstick Nybegynder
12. november 2008 - 14:43 #2
den var først sat til 1024 og troede at det var derfor så skiftede den til this.ReceiveBufferSize
Avatar billede slapstick Nybegynder
12. november 2008 - 14:49 #3
Avatar billede arne_v Ekspert
12. november 2008 - 14:53 #4
1)  Altid laes fra en socket i en while loekke.

2)  Hvorfor ikke bruge WebClient eller (Http)WebRequest fremfor TcpClient ?

3)  Jeg tror ikke at ASCIIEncoding og Content-Type: text/html; charset=iso-8859-1
    virker godt sammen.
Avatar billede slapstick Nybegynder
12. november 2008 - 16:51 #5
arne: det er ikke altid det er et http request da det er en lokal proxyserver jeg laver.. den skal helst kunne bruges til alle slags tcp connections

heh ja der var jeg vist lige for hurtig..
den modtager stadig ikke al data selvom jeg gør sådan her:

public string GetServerResponse()
        {
            StringBuilder returnValue = new StringBuilder();
            NetworkStream networkStream = this.GetStream();
            if (networkStream.CanRead)
            {
                byte[] readBuffer = new byte[1024];
                int numberOfBytesRead = 0;
                do
                {
                    numberOfBytesRead = networkStream.Read(readBuffer, 0, readBuffer.Length);
                    returnValue.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, numberOfBytesRead));
                }
                while (networkStream.DataAvailable);
            }
            return returnValue.ToString();
        }
Avatar billede arne_v Ekspert
12. november 2008 - 16:54 #6
.DataAvailable er ubrugeligt !

Du har 2 muligheder:

1) med keep alive laes HTTP Content-Length header og laes indtil du har laest det antal bytes

2) uden keep alive laes indtil end of stream
Avatar billede arne_v Ekspert
12. november 2008 - 16:54 #7
Skal din proxy server understoette protokoller som WebClient og WebRequest ikke goer ?

(de understoetter ogsaa FTP)
Avatar billede slapstick Nybegynder
13. november 2008 - 12:04 #8
ja den skal kunne understøtte hvilken som helst protokol når det komemr til stykket

jeg har droppet dataavailable
så vidt jeg kan se er grunden til at den stopper med at læse pga lag..
har prøvet diverse ting for at få den til at blive ved selvom der er lag men det spiller ikke..

arne har du et eksempel på din nr 2 mulighed?
Avatar billede arne_v Ekspert
13. november 2008 - 17:30 #9
"Connection: close"

som header i request og laes med:

while((n = stm.Read(buf, 0, buf.Length)) > 0)
{
    // process buf
}
Avatar billede slapstick Nybegynder
14. november 2008 - 11:39 #10
nå jeg kunne sgu ikke få det til at spille så nu er jeg skiftet til async sockets istedet for tcpclient
men jeg når ikke at få data før koden hopper videre..
så jeg mangler højst sandsynligt noget
kode:

class ProxySocket
    {
        byte[] m_DataBuffer = new byte[1024];
        IAsyncResult m_asynResult;
        public AsyncCallback pfnCallBack;
        public Socket m_socClient;
        private string recievedData = "";
        public string RecievedData
        {
            get { return recievedData; }
            set { recievedData = value; }
        }

        public class CSocketPacket
        {
            public Socket thisSocket;
            public byte[] dataBuffer = new byte[1024];
        }

        public void Connect(string ipAddress, int ipPort, int socketTimeout)
        {
            try
            {
                //create the socket instance...
                m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                m_socClient.ReceiveTimeout = socketTimeout;
                m_socClient.SendTimeout = socketTimeout;
                // get the remote IP address...
                IPAddress ip = IPAddress.Parse(ipAddress);
                int iPortNo = System.Convert.ToInt16(ipPort);
                //create the end point
                IPEndPoint ipEnd = new IPEndPoint(ip.Address, iPortNo);
                //connect to the remote host...
                m_socClient.Connect(ipEnd);
                //watch for data ( asynchronously )...
                WaitForData();
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        public void Close()
        {
            if (m_socClient != null)
            {
                //m_socClient.Shutdown (SocketShutdown.Send);
                m_socClient.Close();
                m_socClient = null;
            }
        }

        public void SendData(string data)
        {
            try
            {
                Object objData = data;
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
                m_socClient.Send(byData);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            } 
        }

        public void WaitForData()
        {
            try
            {
                if (pfnCallBack == null)
                {
                    pfnCallBack = new AsyncCallback(OnDataReceived);
                }
                CSocketPacket theSocPkt = new CSocketPacket();
                theSocPkt.thisSocket = m_socClient;
                // now start to listen for any data...
                m_asynResult = m_socClient.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnCallBack, theSocPkt);
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }

        }

        public void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState;
                //end receive...
                int iRx = 0;
                iRx = theSockId.thisSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                recievedData += szData;
                WaitForData();
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
            }
            catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
        }

        public bool IsConnected()
        {
            return m_socClient.Connected;
        }

        public bool DoesStringContain(string serverResponse, string stringToMatch)
        {
            return (serverResponse.IndexOf(stringToMatch) == -1) ? false : true;
        }
    }

kode der bruger klassen:

ProxySocket prxSocket = new ProxySocket(); 

        public string Connect()
        {
            string proxyResponse;
            prxSocket.Connect(privoxyIP, privoxyPort, privoxyTimeout);
            if (!prxSocket.IsConnected())
            {
                privoxyStatus = "Connection to privoxy failed";
                return privoxyStatus;
            }
            else
            {
                proxyResponse = SendRequest("CONNECT " + privoxyRequest + ":" + privoxyRequestPort + " HTTP/1.1\r\n\r\n");
                if (prxSocket.DoesStringContain(proxyResponse, "HTTP/1.0 200 Connection established"))
                {
                    privoxyStatus = "Connection established";
                }
                else if (prxSocket.DoesStringContain(proxyResponse, "HTTP/1.0 503 Connect failed"))
                {
                    privoxyStatus = "Connect failed (503)";
                }
                else if (prxSocket.DoesStringContain(proxyResponse, "HTTP/1.0 404"))
                {
                    privoxyStatus = "Connect failed (404)";
                }
                else
                {
                    privoxyStatus = "Connect failed";
                }
                return privoxyStatus;
            }
        }

        public string SendRequest(string proxyRequest)
        {
            string recieved = "";
            prxSocket.SendData(proxyRequest);
            recieved = prxSocket.RecievedData;           
            return recieved;
        }
Avatar billede arne_v Ekspert
15. november 2008 - 04:18 #11
async er mere vanskeligt end sync, så kan du ikke få sync til at virke, så ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester