2013年8月24日土曜日

【なでしこ】プラグインを作ってみる ~設計編 その8~

なでしこでもプラグインのnakonet.dllを使うとネットワーク通信
できますが、もうちょっとソケットを意識した関数を作ります。

------ここから------

 ・ソケットオープン
    書式:ソケットオープン([int]タイプ)
    戻値:[int]ハンドル
    説明:タイプを指定してソケットを作成(オープンする)。
       タイプには以下の何れかを指定する。
           
            0 : TCP
            1 : UDP
        
          成功した場合には0以上のハンドル値が返される。失敗
          した場合には-1が返される。

 ・ソケット接続待ち
    書式:ソケット接続待ち([int]ハンドル、[int]ポート)
    戻値:[int]結果
    説明:ソケットオープンで取得済のハンドルと、指定のポートを
          使って、TCPで相手が接続してくるのを待つ。
        
          成功した場合は0が、失敗した場合は-1が返される。成功
          した場合、後述の「相手IPアドレス取得」命令を使用
          して、接続相手のアドレスを取得することが出来る。

・ソケット接続
    書式:ソケット接続([int]ハンドル、[str]相手のアドレス、[int]ポート)
    戻値:[int]結果
    説明:ソケットオープンで取得済のハンドルと、サーバ側のアドレス、
         ポートを指定してTCPで接続する。
        
          接続が成功した場合には0が、失敗した場合には-1が返される。

・TCP送信
    書式:TCP送信([int]ハンドル、[int]バッファ、[int]サイズ)
    戻値:[int]サイズ
    説明:ソケットオープンで取得済のハンドル、且つこのソケットで
       相手に接続している場合に、バッファで指定されるハンドル
          のデータをサイズ分送信する。バッファはバッファ確保で
          取得したハンドルを指定すること。
        
          成功した場合には送信出来たサイズが返される。失敗した
          場合には-1が返される。

・TCP受信
    書式:TCP受信([int]ハンドル、[int]バッファ)
    戻値:[int]サイズ
    説明:ソケットオープンで取得済のハンドル、且つこのソケットで
       相手に接続している場合に、バッファで指定されるハンドル
          にデータを受信する。

          成功した場合には受信出来たサイズが返される。失敗した
          場合には-1が返される。

・UDP送信
    書式:UDP送信([int]ハンドル、[int]バッファ、[str]相手アドレス、[str]ポート)
    戻値:[int]サイズ
    説明:ソケットオープンで取得済のハンドルと、送信対象のバッファ
       のハンドル、及び相手アドレスとポートを指定してデータを
          送信する。ソケットハンドルはUDPでオープンされていること。
        
          成功した場合には送信サイズが返さえる。失敗した場合には
          -1が返される。

・UDP受信
    書式:UDP送信([int]ハンドル、[int]バッファ、[str]ポート)
    戻値:[int]サイズ
    説明:ソケットオープンで取得済のハンドルと、受信データ書きこみ
       用のバッファハンドル、及びポートを指定してデータを受信
          する。なお、ポートが設定されるのは最初の1回だけど、それ
          以降は無視される。
        
          成功した場合には受信出来たサイズが返される。失敗した
          場合には-1が返される。

・相手IPアドレス取得
    書式:相手IPアドレス取得(#引数なし)
    戻値:[str]相手IPアドレス(文字列)
    説明:TCP通信で接続した相手のアドレス、及びUDP通信で受信した
       場合の相手のIPアドレスを文字列で返す。DLL内部では
          1箇所でしか記憶していないので、複数ソケットを開いている
          場合等は、最後に接続/受信させれたものが記憶される。

------ここまで------

普通ネットワーク系のプログラムは受信用にスレッド使うのが
一般的ですが、今回は関数だけ用意してスレッドには対応して
ません。なのでちょっと使いにくいかも…。UDPでちょっと送受信
するぐらいなら使えますかね。