2017-05-26 10 views
-1

ソケットへのストリームをネットワークに書き込もうとしましたが、次のエラーを取得して拒否したため、接続できませんでした私たちは印刷するものがあり、クライアントが接続されているかどうかをチェックし、接続していなければストリームを取得し、ストリームに書き込んでフラッシュします。れるtcpClient:ターゲットマシンが積極的にそれが

サンプル・コードは次のとおりです。

/// <summary> Print via TCP </summary> 
private void PrintViaTcp(object a) 
{ 
    Debug.WriteLine($"Printing via TCP..."); 
    var labelData = a as LabelData;    

    // Send data to the label printer 
    SendToLabelPrinter(labelData.Commands, labelData.PrinterAddress, labelData.Port); 

    Debug.WriteLine(" -> Printed labelId : {0}", labelData.LabelId); 
} 

/// <summary> Send the native command to the label printer </summary>   
public void SendToLabelPrinter(string commands, string address, int? port) 
{       
    //Connect to tcp client if a connection does not exist 
    if (!TcpClient.Connected) TcpClient.Connect(address, port ?? 9100); 

    //Get the network stream 
    var stream = TcpClient.GetStream(); 

    // Send command strings to printer 
    //stream.Write(Encoding.ASCII.GetBytes(commands), 0, commands.Length); 
    stream.Write(Encoding.GetEncoding(850).GetBytes(commands), 0, commands.Length); 

    //Flush the buffer on the network stream 
    stream.Flush();   
} 

これは、小さなプリントジョブ< 100のプリントのために動作しますが、私は100の上に行くとき、エラーがランダムに不足しているプリントを発生します。分析すると、ランダムに発生するTCPまたはネットワークの問題の根本原因を見つけるために

+0

これは並行性の問題のようです。プリンターサーバーで同時に処理できるジョブの数を確認する必要があります – yorodm

答えて

0

ベストな方法は、送られているとの接続は以下のようにまた

の間に拒否されるか何に多くの洞察を提供することができるWiresharkのを見て開始することですあなたのコードでは、TCPClientにタイムアウトの設定はありません。より多くのデータ量を送受信するときは、より高い値の **timeouts**を設定してみてください。これは問題である可能性があります。再びwiresharkのには、接続を閉じてしまったし、誰がそれを開始したか、すべての詳細を知っているだろう...ちょうどFINフラグを探し

Wireshark download

0

ネットワークスタックは、一度に1つの接続を処理することができますし、8かそこらの接続をキューすることができます接続が拒否される前に個々の接続要求を多数送信する場合は、拒否を考慮する必要があり、プリンタが要求を処理できるまでバックオフする必要があります。

もう1つの方法は、すべての印刷ジョブを送信する印刷ハンドラを作成することです。

最初の要求がプリンタにオープン接続されているとき。 新しい要求が来ると、それらをキューに追加します。 1分間接続が使用されていない場合は、接続を閉じます。

関連する問題