2017-06-14 22 views
0

私はURLと私のコードの間に連続的な接続を見つけようとしています。私は500m/sごとにjsonでhttpにデータを送信しています。しかし、私がWireSharkをチェックしたときに、接続が切断され、再度接続されています。私は3つ(httpwebrequest、cURL、webclient)を試して、私は彼らが連続的な接続を与えることを望んでいる。さて、私はcURLがそれをやりたいだけです。私が試したコードとwiresharkからのキャプチャがあります。C#HttpWebRequestまたはcURLの連続接続を希望する

cURLの 100メートル/ sの機能

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    
    } 

主な機能

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

あなたがWiresharkのキャプチャに見ることができるように、彼らはその後、フィン/ ACKとによって切断されていますSynによって再び接続します。私はちょうどプログラムが始まるときに1つのSYNをし、次に進捗の最後にFIN/ACKをします。どんな助けでも感謝します。

+0

接続を維持したいのですか?あなたはそれを保証することはできません。あなたができることは、すでに行ったことです。サーバーに接続を維持するように依頼してください。しかし、サーバーが応答を送信した後に接続を閉じることを決定した場合は、 – Gusman

+0

サーバが接続を閉じるまで、サーバとプログラムの間の接続を開くKeep Aliveがありますか?それは私がcURLで生きている接続を維持する方法を知っているかもしれませんか?私はこれを行いました(SystemStatusEasy.SetOpt((CURLoption)213、1L);).NET用の正しいapiが見つかりませんでしたが、C言語ではcurl_easy_setopt(curl、CURLOPT_TCP_KEEPALIVE、1L);があります。 https://curl.haxx.se/libcurl/c/CURLOPT_TCP_KEEPALIVE.htmlにあります。私はCURLOPT_TCP_KEEPALIVEが列挙型であり、213の数を持っていることを知っています。だから私はSystemStatusEasy.SetOpt((CURLoption)213、1L)のように入れようとしました。 –

+0

しかし、私は正しいかどうかはわかりません.C#とcURLについての情報はあまりありません.T^T苦しい貧しい人のための提案はありますか? –

答えて

0

これは私がHttpWebRequestで行ったことです。

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);    
     } 
    } 

最後にwiresharkの結果。 wireshark capture

まあ、1つのSYNと1つのFIN/ACKを与えます。しかし私はサーバー500m/sにシステムデータを継続的に送信しています。なぜそれが私にFIN/ACKを与え、その後データを送信しなかったのですか?

関連する問題