send/recv 関数について

[戻る]
野木口 2008/02/25(月) 20:57:21
環境 Winxp VC++6.0 Win32SDK

send/recv 関数について、
安全性を高めようと以下のような関数を
作ったのですが、これについて、
意味がない、逆に危険、こうした方が良い、
といったご指摘がありましたらお教えください。

int recv(SOCKET s, char* buf, int len)
{
  int n = 0;
  while (1) {
    n += recv(s, (buf+n), (len-n), 0);

    if (n == -1)      return -1;  // エラー 
    else if (n == 0)  return 0;   // 接続終了
    else if (n < len) continue;   // 未受信あり
    else              return n;   // 正常に受信完了
  }
}

int send(SOCKET s, char* buf, int len)
{
  int n = 0;
  while (1) {
    n += send(s, (buf+n), (len-n), 0);

    if (n == -1)      return -1;  // エラー
    else if (n == 0)  return 0;
    else if (n < len) continue;   // 未送信あり
    else              return n;   // 正常に送信完了
  }
}

len は常に一定の大きさです。

a 2008/02/25(月) 21:38:55
再帰になってる様だが…スタック大丈夫?

野木口 2008/02/25(月) 22:39:16
n += ...
 の行は本来の関数を読んでいるつもりなんですが
再帰になってしまっているんでしょうか?

野木口 2008/02/25(月) 22:43:52
定義の引数は
  recv(SOCKET, char*, int)

で、n += ...の行は
  recv(SOCKET, char*, int, int)

です

シャノン 2008/02/25(月) 22:51:49
データが2回に分けて送受信されるとして、1回目で成功、2回目で失敗したら、nは決
して-1にも0にもならないんじゃないですかね。

野木口 2008/02/25(月) 23:01:22
シャノン さん、ありがとうございます。
以下のように直してみました。

int recv(SOCKET s, char* buf, int len)
{
  int n=0, t=0;
  while (1) {
    n = recv(s, (buf + t), (len - t), 0);

    if (n == -1)      return -1;  // エラー 
    else if (n == 0)  return 0;   // 接続終了
    else {
      t += n;
      if (t < len)  continue;     // 未受信あり
      else          return t;     // 正常に受信完了
    }
  }
}

野木口 2008/02/28(木) 00:06:28
[[解決]]
特に問題も見つからないので、
これで行こうと思います。

ありがとうございました。

古いスレッドには追加発言できません。