none
Socket.SendのSocketFlagsの意味を教えてください RRS feed

  • 質問

  • 尾崎と申します。

     

    モバイルからFTP転送するプログラムを作成しています。

    (方法A)の場合、大きなファイルをアップロードすると転送途中にSocket.Sendメソッドで止まってしまいます。

    (方法B)の場合は、問題なく転送できます。

     

    (方法A)Send(bytes, (int)bytes, 0);
    (方法B)Send(bytes, (int)bytes, 0, SocketFlags.None);

     

    SocketFlagsを省略した場合は、SocketFlags.Noneのはずなのですが、

    (方法A)と(方法B)で挙動が異なります。

     

    どなたか違いを教えてください。よろしくお願いします。

    2008年6月10日 10:09

回答

  • #方法Bで問題なく転送できているという事から以下は間違っているかもしれません

     

    そもそも意図していないSendを呼び出している気がします。

     

    方法AはSocket.Send (Byte[], Int32, SocketFlags)

    方法BはSocket.Send (Byte[], Int32, Int32, SocketFlags)

    を呼び出していると思います。

    方法Aの第2引数は送信するバイト数ですが

    方法Bの第2引数はオフセット、第3引数が送信するバイト数です。

     

    正しくは以下のパターンの呼び出しではないでしょうか。

    送信バイト数 = byte配列長ならば Send(bytes, SocketFlags.None);

    送信バイト数 != byte配列長ならば Send(bytes, sendSize, SocketFlags.None);//sendSize は送信バイト数

     

    2008年6月10日 14:05

すべての返信

  • #方法Bで問題なく転送できているという事から以下は間違っているかもしれません

     

    そもそも意図していないSendを呼び出している気がします。

     

    方法AはSocket.Send (Byte[], Int32, SocketFlags)

    方法BはSocket.Send (Byte[], Int32, Int32, SocketFlags)

    を呼び出していると思います。

    方法Aの第2引数は送信するバイト数ですが

    方法Bの第2引数はオフセット、第3引数が送信するバイト数です。

     

    正しくは以下のパターンの呼び出しではないでしょうか。

    送信バイト数 = byte配列長ならば Send(bytes, SocketFlags.None);

    送信バイト数 != byte配列長ならば Send(bytes, sendSize, SocketFlags.None);//sendSize は送信バイト数

     

    2008年6月10日 14:05
  • 方法Bの方法は、ご指摘の通り誤りでした。

    サーバーに作成されたファイルのサイズが0バイトでした。

     

    現在の問題は、

    モバイルから大きなファイルをFTP転送すると、

    Sendメソッドが無応答になることなので、別のスレッドで投稿します。

    このスレッドは、閉じます。

     

    C.John さんありがとうございました。

     

    2008年6月11日 3:41