2017-06-14 4 views
0

Ich versuche eine kontinuierliche Verbindung zwischen URL und meinem Code zu finden. Ich sende alle 500m/s Daten an http in JSON. Die Verbindung wird jedoch getrennt und erneut verbunden, als ich WireShark überprüfte. Ich habe versucht drei (httpwebrequest, cURL, Webclient) und was ich will ist sie kontinuierliche Verbindung zu geben. Nun, ich will nur, dass cURL das macht. Hier sind die Codes, die ich ausprobiert habe, und ein Capture von wireshark, damit Sie besser verstehen.C# HttpWebRequest oder cURL wollen kontinuierliche Verbindung

cURL 100m/s Funktion

static private void SystemStatusTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 

     string json = new JavaScriptSerializer().Serialize(new 
     { 
      cpuusage = CPU, 
      availablememory = AVAILMEMORY, 
      availableharddiskspace = AVAILABLEHD 
     }); 
     Easy.WriteFunction wf = SystemStatusWF; //response 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_URL, SYSTEMSTATUS_SERVER); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, json); 
     var resultOK = SystemStatusEasy.Perform(); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); //response    
    } 

Hauptfunktion

static void Main() 
    {    
     Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 

     SystemStatusEasy = new Easy(); 
     var slistHeaders = new Slist(); 
     slistHeaders.Append("Content-Type: application/json"); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_VERBOSE, 1L); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_HTTPHEADER, slistHeaders); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_CUSTOMREQUEST, "POST"); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_POST, true); 
     SystemStatusEasy.SetOpt((CURLoption)213, 1L); //keep alive(not sure in c#) 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_TIMEOUT, false); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, "cookie.txt"); 
     SystemStatusEasy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, "cookie.txt"); 

     systemStatusTimer = new Timer(500); 
     systemStatusTimer.Elapsed += SystemStatusTimer_Elapsed; 
     systemStatusTimer.Start();    

     Console.ReadKey(); 
    } 

Wireshark Capture

Wie man auf dem Wireshark-Capture sehen können, sie durch fin/ack getrennt werden und dann verbindet sich erneut mit Syn. Ich will nur ein SYN wenn das Programm startet und dann FIN/ACK am Ende des Fortschritts. Jede Hilfe würde geschätzt werden.

+0

Meinst du, du willst die Verbindung am Leben erhalten? Sie können es nicht sicherstellen, das Beste, was Sie tun können, ist das, was Sie bereits getan haben. Bitten Sie den Server, die Verbindung am Leben zu erhalten. Wenn der Server die Verbindung nach dem Senden einer Antwort jedoch schließt, können Sie nichts tun. – Gusman

+0

Also ist es am Leben, die die Verbindung zwischen dem Server und dem Programm öffnet, bis der Server die Verbindung schließt? Wenn ja, kann ich wissen, wie man die Verbindung in cURL aufrecht erhält? Ich tat dies (SystemStatusEasy.SetOpt ((CURLoption) 213, 1L);) weil ich nicht die richtige API für .NET finden konnte, aber ich weiß in C, es hat curl_easy_setopt (curl, CURLOPT_TCP_KEEPALIVE, 1L) ;. Es könnte in https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.html gefunden werden. Ich weiß, dass CURLOPT_TCP_KEEPALIVE in enum ist und die Nummer 213 hat. Also habe ich versucht, es wie SystemStatusEasy.SetOpt ((CURLoption) 213, 1L) zu setzen; –

+0

Aber nicht sicher, ob ich recht oder nicht getan habe. Es gibt nicht viele Informationen über C# und cURL..T^T Irgendwelche Vorschläge für einen armen, kämpfenden Typen? –

Antwort

0

Also das ist, was ich mit HttpWebRequest getan habe.

static HttpWebRequest httpWebRequest; 
static void Main() 
    { 
     httpWebRequest = (HttpWebRequest)WebRequest.Create(SYSTEMSTATUS_SERVER); // 

     systemStatusTimer = new Timer(500); 
     systemStatusTimer.Elapsed += SystemStatusTimer_Elapsed; 
     systemStatusTimer.Start(); 

     Console.ReadKey(); 
    } 

static private void SystemStatusTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 

     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 
     httpWebRequest.KeepAlive = true; 
     httpWebRequest.CookieContainer = cookieContainer; 
     httpWebRequest.ServicePoint.SetTcpKeepAlive(true, 100000, 1000); 
     Console.WriteLine(cookieContainer); 

     Console.WriteLine("system Status 100m/s : {0}\t{1}\t{2}", CPU, AVAILABLEHD, AVAILMEMORY); 
     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = new JavaScriptSerializer().Serialize(new 
      { 
       cpuusage = CPU,      
       availablememory = AVAILMEMORY, 
       availableharddiskspace = AVAILABLEHD 
      }); 

      streamWriter.Write(json); 
     } 

     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
      var result_header = httpResponse.Headers; 

      Console.WriteLine("The response of sysStatus from server : " + result);    
     } 
    } 

Endlich das Ergebnis von wireshark. wireshark capture

Oh gut, es gibt nur ein SYN und ein FIN/ACK. Allerdings sende ich kontinuierlich Systemdaten an den Server 500m/s. Warum hat es mir FIN/ACK gegeben und danach keine Daten gesendet?

Verwandte Themen