プロが教えるわが家の防犯対策術!

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

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

この関数を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 );
}

A 回答 (5件)

たの方もおっしゃっている事ですが気になる点がいくつかあります。



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をループさせます。
    • good
    • 0

ソケットエラーの10061は接続を拒否されたエラーだそうです。


MSDNの検索で数値をいれて検索してね。

サーバー側が同時に接続できる数を超えて繋ごうとしてるんじゃないかなー
    • good
    • 0

エラーコードの示す通り、本当に接続が拒否されているのではないですか?


例えば相手方がNTWorkstationで、最大接続数を越えてるとか。

この回答への補足

早速のご回答ありがとうございます。
自分が今回やりたいのは、1回線のみでよいのですが・・・
どうしたらよいのでしょう?

補足日時:2001/05/15 16:10
    • good
    • 0

サーバ側で幾つまでコネクションを持てるんでしょうね?


毎回 closesocket() すれば良いんじゃないでしょうか。

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

この回答への補足

おぉ!ありがとうございます。
早速そのように変更しておきます。

補足日時:2001/05/15 16:48
    • good
    • 0

ソースは一部抜粋ですよね??



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

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

この回答への補足

えー、Cは詳しくないので、申し訳ありませんが、
Cで、メモリの解放はどのように行うのでしょうか?(各変数、オブジェクトに使用した)

補足日時:2001/05/15 16:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!