goo blog サービス終了のお知らせ 

ネットワークとプログラム

ネットワークとプログラムで困ったこと、勉強したこと、その他をつづっていくページです。

HttpWebRequestの連続呼び出し。

2011年03月22日 | プログラム

C#( 2.0 )で Web監視ツールをテスト的に作成するために、HttpWebRequest を連続して呼び出すと3回目以降に
必ず、 WebException の例外が発生する。内容は、「操作はタイムアウトになりました。」とのこと。

ん~~~~。

調査の結果、 Abort()を呼び出すと解決するらしい。
サンプルは以下の例・・・。

while(true){
try{
 WebRequest http = HttpWebRequest.Create(url);
 http.Proxy = null;//自動プロキシ検索を無効
 http.Timeout = 2000;//タイムアウト値の設定 (2秒)
 HttpWebResponse response = (HttpWebResponse)http.GetResponse();
Console.WriteLine("The site is up.");
 http.Abort();//これを入れないと3回目以降失敗し続ける。
}catch (WebException webexc)
{
 Console.WriteLine("The site is down. : " + webexc.Message);
}
Thread.Sleep(5000); //5秒に待つ
}

忘れずにメモメモ

HttpWebRequestのプロキシ機能をオフにする

2011年03月21日 | プログラム

HttpWebRequestクラスで HTTP(S)通信をする場合、始めのレスポンスが遅い。
15秒ぐらいは、待ち時間がある。
なぜだと調べた所、以下のサイトで書いてあった。自動プロキシ機能が働いているとのことだった。
プロキシ設定によりWebページへのアクセスを高速化するには?

実行ファイル(test.exe)と同じ場所に、実行ファイル名.config(test.exe.config)というファイルを作成して、
置くことにより、レスポンスが早くなった。

<>は全角になっている。

------------------------
<configuration>
 <system.net>
  <defaultProxy>
    <proxy usesystemdefault="false" />
 </defaultProxy>
 </system.net>
</configuration>
-----------------------

または、以下のように、プログラム中で、nullを設定する。

WebRequest http = HttpWebRequest.Create(url);
http.Proxy = null;

 

忘れずに、メモメモ。


Activatorの使い方

2010年10月10日 | プログラム
C# で Activator の使い方 クラスの生成方法として、new と Activator がある。 Activator の使用方法のサンル。

///////////////////////////////////////////////////////////
namespace ActivatorTest
{
  public class sampleClass
  {
    public virtual void say()
    {
      Console.WriteLine("Say Sample!");
    }
  }
  class Program
  {
   Type sampleType = Type.GetType("ActivatorTest.sampleClass");
   sampleClass sa = (sampleClass)Activator.CreateInstance(sampleType);
   sa.say();
  }
}

///////////////////////////////////////////////////////////
GetType()の引数は、フルパスで書くことを忘れない。
namespaceを書くのを忘れると、戻り値がNULLになる。

メモメモ

PHPでメール送信2

2010年01月27日 | プログラム
前回、PHPでメール送信のプログラムだが、検証した環境は以下でした。
・Windows Server 2008 R2
・PHP5.2.12
・メールサーバは、Windows Serverに入っているSMTPサービスを有効にした

mb_send_mail( $_POST["rept"] , $_POST["subject"], $message , $header )
上記のコマンド $header に "From: ~~~~"と書くと、送信元のエンベローブにも
同じアドレスを記述してくれました。

安心して、Linuxでも同様に実施しました。環境は以下です。
・CentOS4.4
・PHP4.3.??
・メールサーバは、Postfix をローカルに起動

上記と同じ mb_send_mail()のPHPを実行すると、送信元のエンベローブには、
apache@ホスト名 となっているではありませんか。
postfixのメールログで確認・・・・。
ん~~~~~

悩んだ結果、mb_send_mailの5つ目の引数に "-f 送信元のメールアドレス" を
付与した結果、エンベローブも送信元のメールアドレスになりました。

PHPのバージョンが違うため、なんとも言えませんが、このような現象が発生したので、忘れずに、メモメモ。
メールサーバの挙動の違いでこうなっているかもしれませんが・・・・。

PHPでメール送信

2010年01月21日 | プログラム
PHPでメールを送信するプログラムを学生に説明するために作成したサンプルプログラム
作成したファイルをUTF-8で保存することを忘れない。
勝手に使用されても困るため、パスワードチェックも入れている。

<?php

if( isset($_POST["pass"]) && ( $_POST["pass"] == "XXXXXXXXXX" ) ){

 //本文はエンコーディングしてくれる。
  mb_language("Japanese"); 
  mb_internal_encoding("UTF-8");

  $from = $_POST["mail"];
  $name = $_POST["name"];

  //ヘッダー作成
  //ヘッダーの中身は自分で必要に応じてエンコーディング
  $header = "From: " . mb_encode_mimeheader($name,"UTF-8") . "<" . $from . ">\n";
  $header .= "Reply-To: " . $from . "\n";
  $header .= "X-Mailer: phpMail ". phpversion(). "\n";

  $message = "発信者名:" . $name . "\n本文:\n" . $_POST["message"];
  if ( ! mb_send_mail( $_POST["rept"] , $_POST["subject"], $message , $header ) )
    $message = "mb_send_mailコマンド送信に失敗しました";
  }else{
    $message = "[" . $message . "] を送信しました。";
  }
}else{
   $message =" パスワードが違います。";
}
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>メール送信結果</title>
</head>
<body>
メール送信結果 <br>
<p><?php echo $message; ?></p>
</body>
</html>

セキュリティは考慮せずに、動作確認だけ実施。

メモメモ

MessageBoxの戻り値

2009年12月10日 | プログラム
C#のMessageBoxの返信を元に処理を分ける

// どのボタンを選択したかを判断する
if (MessageBox.Show("終了しますか?", "確認", MessageBoxButtons.YesNo) == DialogResult.Yes) {
MessageBox.Show("終了します");
  ダイアログを閉じる処理を行う。
} else {
MessageBox.Show("Noボタンを選択しました");
  何か処理があれば。
}

DialogResult.Yes の部分をメモメモ


C#でHTTPRequestのプログラムを作る。

2009年12月07日 | プログラム
C#でHTTPRequestのプログラムを作成する。送信元ポート番号を指定したいため。
ここで必要な内容は、Socket.Bind()の部分。 
-------------------
Socket sock = null;
string resMsg = "";
Encoding enc = Encoding.UTF8;
string server = txt_ipaddress.Text; //接続先サーバ
int source_port = Convert.ToInt32(txt_src_port.Text); //接続先のポート番号
int dest_port = Convert.ToInt32(txt_dest_port.Text); //送信元のポート番号
byte[] reqMsg = Encoding.UTF8.GetBytes(txt_ReqMsg.Text);//送信するリクエスト内容
Console.WriteLine(txt_ReqMsg.Text); 
IPAddress hostadd = Dns.GetHostEntry(server).AddressList[0];
IPEndPoint ephost = new IPEndPoint(hostadd, dest_port);
IPEndPoint localEP = new IPEndPoint(IPAddress.Any, source_port);
try{
  sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  sock.Bind(localEP);
  sock.Connect(ephost);
  sock.Send(reqMsg, reqMsg.Length, SocketFlags.None);
  byte[] resBytes = new byte[1024];
  MemoryStream mem = new MemoryStream();
 while (true){
  int resSize = sock.Receive(resBytes, resBytes.Length, SocketFlags.None);
  if (resSize == 0) break;
   mem.Write(resBytes, 0, resSize);
  }
  resMsg = enc.GetString(mem.GetBuffer(), 0, (int)mem.Length);
  mem.Close();
  sock.Shutdown(SocketShutdown.Both);
  sock.Close();
 }
 catch (Exception exc){
  MessageBox.Show("Error:" + exc.Message);
  txt_ResMsg.Text = exc.Message;
  if( sock != null ) sock.Close();
}
txt_ResMsg.Text = resMsg;
 

 メモメモ

C#を使いAccessに接続し、テーブル操作

2009年12月06日 | プログラム

C#でAccess2007に接続して、データ取得、データ書き込みする。

(1) テーブル内容をDataSetにデータを格納するプログラム。
string query = "select * from 車情報";
DataSet ds=new DataSet("車テーブル"); //"車テーブル"という識別名
OleDbConnection cn;
string query = "select * from 車情報";
cn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./車販売.accdb"); // Access2007を想定。
cn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(query, cn);
adapter.Fill(ds, "車テーブル"); //実行  dsに入る。
cn.Close();

必要であれば、
ds.Tables["車テーブル"]~ とアクセスする。

(2) insert してデータを書き込む。
string querystring = "insert into 車情報(" ~~ ") values (" ~~ ")";
OleDbCommand sqlcmd = new OleDbCommand(querystring, cn);
cn.Open(); ←cnは、(1)を利用。
sqlcmd.ExecuteNonQuery();   ←取得しないので、Non
cn.Close();

忘れずにメモメモ。

C# MemoryStreamを使用した解凍(DeflateStream)

2009年08月21日 | プログラム
解凍のプログラムリストを書く。
圧縮したデータbyte[] dataを解凍するプログラムを記述する。
MemoryStreamに保存する手順とする。

プログラムリスト
圧縮したデータは、 byte[] compressData に入っていると想定する。

byte[] buffer = new byte[1024]; //解凍するときに一時的に保持するバッファ
MemoryStream mssrc = new MemoryStream(compressData);
MemoryStream outstream = new MemoryStream();

DeflateStream uncompressStream = new DeflateStream(mssrc, CompressionMode.Decompress);
while (true) {
  int readSize = uncompressStream.Read(buffer, 0, buffer.Length);
  if (readSize == 0) break;
  outstream.Write(buffer, 0, readSize);
  //上記の0は常に0とする。Streamなので書き込むと位置は進むため。
}
uncompressStream.Close();
byte[] outByte = outstream.ToArray();

メモメモ