-PR-
締切り
済み

VC++でのソケット通信について

  • すぐに回答を!
  • 質問No.76294
  • 閲覧数1871
  • ありがとう数6
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 0% (0/5)

いつも拝見させていただいております。
このたびは、皆様のお知恵をお借りしたく質問させていただきました。

ソケット通信を行いたく、以下のサンプルを作成いたしました。

この関数を5回ループさせると、エラーが起きてしまいます。
エラーコードは10061です。

解決方法をご存知の型が降りましたら、
ご教授ください。

よろしくお願いいたします。

(VC++での開発です)

extern "C" __declspec( dllexport ) bool __stdcall ssl_SockOpen(LPSTR p_c_IpAddress, LPSTR p_c_PortNum)
{
struct sockaddr_in addr;//socketの情報を代入する構造体
WSADATA p_obj_SockInit;//Windows Sockets初期化変数


//■ Windows Socketsを初期化する
WSAStartup( 0x0101, &p_obj_SockInit );

//■ ソケット確保
if( (g_obj_Socket = socket( AF_INET, SOCK_STREAM, 0 )) < 0 ){
pMsg = "ソケットの確保に失敗しました。";
return false;
}

//■ ソケットの情報を入れる
memset( &addr, 0, sizeof( addr ) );//構造体addrの初期化
addr.sin_family = AF_INET;//AF_INETを指定
addr.sin_port = htons( atoi( p_c_PortNum ) );//ポートを指定
addr.sin_addr.s_addr = inet_addr( p_c_IpAddress );//inet_addr()により指定されたIPを構造体に代入

//■ 接続要求を行う▼▼▼▼ここでエラー!!▼▼▼▼
if( connect( g_obj_Socket, (struct sockaddr *)&addr, sizeof(addr) ) < 0 ){
pMsg = "接続要求に失敗しました。";
int i;
i = GetLastError( );

return false;
}
return( true );
}
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全5件)

  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

サーバ側で幾つまでコネクションを持てるんでしょうね? 毎回 closesocket() すれば良いんじゃないでしょうか。 後、エラーには関係ないと思いますが WSAStartup() は アプリケーションが立ち上がったときに一発呼ぶだけで 大丈夫ですよ。 ...続きを読む
サーバ側で幾つまでコネクションを持てるんでしょうね?
毎回 closesocket() すれば良いんじゃないでしょうか。

後、エラーには関係ないと思いますが WSAStartup() は
アプリケーションが立ち上がったときに一発呼ぶだけで
大丈夫ですよ。
補足コメント
Princeso

お礼率 0% (0/5)

おぉ!ありがとうございます。
早速そのように変更しておきます。
投稿日時 - 2001-05-15 16:48:06


  • 回答No.5
レベル13

ベストアンサー率 37% (570/1525)

たの方もおっしゃっている事ですが気になる点がいくつかあります。 1.WSAStartupの呼び出しは1度だけ。   2回以上呼び出す時はWSACleanupの後で行う。 2.WSACleanupの呼び出しが無い。 3.shutdown,closesocketの呼び出しが無い。 4.GetlastErrorはWSAGetLastErrorをラッピングしているものと考えてよいのか? 通常、 ...続きを読む
たの方もおっしゃっている事ですが気になる点がいくつかあります。

1.WSAStartupの呼び出しは1度だけ。
  2回以上呼び出す時はWSACleanupの後で行う。
2.WSACleanupの呼び出しが無い。
3.shutdown,closesocketの呼び出しが無い。
4.GetlastErrorはWSAGetLastErrorをラッピングしているものと考えてよいのか?

通常、TCP/IP通信のクライアント側の流れは以下のようになります。

1.初期化(WSAStartup)
2.ServerのIPアドレス解決(gethosybyname,gethostbyaddr)
3.サービスポート解決(getportbyname)
4.ソケット生成(socket)
5.接続確立(connect)
6.データ通信のループ(send,recv)
7.切断準備(shutdown)
8.切断、ソケット廃棄(closesocket)
9.WSACleanup
今回の質問の場合、2,3は直接指定しているのでOKでしょう。
7は必須ではありませんが「お行儀の良い切断」を行う為に推奨されます。
接続を複数回繰り返すのであれば2~8をループさせます。
  • 回答No.3
レベル8

ベストアンサー率 46% (22/47)

エラーコードの示す通り、本当に接続が拒否されているのではないですか? 例えば相手方がNTWorkstationで、最大接続数を越えてるとか。 ...続きを読む
エラーコードの示す通り、本当に接続が拒否されているのではないですか?
例えば相手方がNTWorkstationで、最大接続数を越えてるとか。
補足コメント
Princeso

お礼率 0% (0/5)

早速のご回答ありがとうございます。
自分が今回やりたいのは、1回線のみでよいのですが・・・
どうしたらよいのでしょう?
投稿日時 - 2001-05-15 16:10:40
  • 回答No.4
レベル10

ベストアンサー率 17% (31/179)

ソケットエラーの10061は接続を拒否されたエラーだそうです。 MSDNの検索で数値をいれて検索してね。 サーバー側が同時に接続できる数を超えて繋ごうとしてるんじゃないかなー
ソケットエラーの10061は接続を拒否されたエラーだそうです。
MSDNの検索で数値をいれて検索してね。

サーバー側が同時に接続できる数を超えて繋ごうとしてるんじゃないかなー
  • 回答No.1
レベル13

ベストアンサー率 33% (427/1283)

ソースは一部抜粋ですよね??  これだけだとなんとも言えないのですが、確保したメモリが解放されていない為に発生していると思われます。  各オブジェクトの取得と解放を追ってみて下さい。どうもオブジェクトの解放あたりが怪しそう。 ...続きを読む
ソースは一部抜粋ですよね??

 これだけだとなんとも言えないのですが、確保したメモリが解放されていない為に発生していると思われます。

 各オブジェクトの取得と解放を追ってみて下さい。どうもオブジェクトの解放あたりが怪しそう。
補足コメント
Princeso

お礼率 0% (0/5)

えー、Cは詳しくないので、申し訳ありませんが、
Cで、メモリの解放はどのように行うのでしょうか?(各変数、オブジェクトに使用した)
投稿日時 - 2001-05-15 16:46:07
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ