• 締切済み

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

いつも拝見させていただいております。 このたびは、皆様のお知恵をお借りしたく質問させていただきました。 ソケット通信を行いたく、以下のサンプルを作成いたしました。 この関数を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 ); }

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.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をループさせます。

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.4

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

回答No.3

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

Princeso
質問者

補足

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

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

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

Princeso
質問者

補足

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

  • mnabe
  • ベストアンサー率33% (427/1283)
回答No.1

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

Princeso
質問者

補足

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

専門家に質問してみよう