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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qselect(ソケット)

ソケットを用いてプログラミングしていると、よく出てくると思うのですが、次の意味を教えてください。
select(SH); $| = 1; select(STDOUT);
$|(特殊記号)やSTDOUTなど、なるべる細かく教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれます。

また、デフォルトではSTDOUTが選択状態になっていますので
> print "hello.\n";

> print STDOUT "hello.\n";
の省略形というわけです。

余談ですが、Perl使いは面倒くさがりが多いので慣用句みたいに
> select((select(SH),$|=1)[0]);
と、まとめて書く人もいます。
これはselectが返す値が直前まで選択されていたソケットだからできる技です。

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれま...続きを読む

Qstruct tanka_kosuu kosuu[10];に付いているアンダーバー"_"の意味

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10];
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
int i;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
for ( i = 0; i < nyuuryoku_kosuu-1; i++ ){
kosuu[i].kingaku = kosuu[i].tanka * kosuu[i].kosuu;
printf("%d\t%d\t%d\n", kosuu[i].tanka,
kosuu[i].kosuu, kosuu[i].kingaku);
}
printf("goukei=%d\n",goukei_kingaku(kosuu, nyuuryoku_kosuu-1));
return 0;
}
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu)
{
int i;
int goukei = 0;
for ( i = 0; i < nyuuryoku_kosuu; i++ ){
goukei += kosuu[i].kingaku;
}
return goukei;
}

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10...続きを読む

Aベストアンサー

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線で区切る "アッパーケース"

C言語の構造体の場合ですが、
慣習として スネークケース または キャメルケース あたりが一般的な様です。

というわけで質問の回答としては、
そのプログラムを作った人の命名規則が、構造体名はスネークケースだった。

ちなみに、
言語仕様的に使えないチェインケースを除いて、どの命名規則でもコンパイルエラーになることはありません。
ただし、コンパイラーとは別に静的コード解析をしている場合は、変な命名だと警告されるかもしれません。


以下参考です。

慣習の由来はたぶんこれ
http://www.amazon.co.jp/dp/4320026926

命名規則が パスカルケース または アッパーケース の例
https://msdn.microsoft.com/ja-jp/library/kbt00480.aspx

言語によっては、この手の命名規則についての公式ガイドラインがあります
http://www.oracle.com/technetwork/java/codeconventions-135099.html
https://msdn.microsoft.com/ja-jp/library/ms229043.aspx

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線...続きを読む

QTCP/IPプログラミングでのselectについて

selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。
では、コネクション要求(connect)は、検知するのでしょうか?
どなたか回答よろしくお願いします。

Aベストアンサー

もちろん検知しますよ。
LISTENしているソケットに対しての要求を検知したら
acceptしてやればOKです。

Qstruct tanka_kosuu kosuu[10];の[10]て何

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上ですが、
 struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
以上と
struct tanka_kosuu kosuu[10];は
 以下
int tanka;
int kosuu[10];
int kingaku;
 と同じ意味ですか?
 それとも
  int tanka[10];
int kosuu[10];
int kingaku[10]; 
 と同じ意味ですか?
int tanka[10];と
 int kingaku[10];の
 合計に[10]は必要ないですよね
以上すべて私の考え方が間違っていたならごめんなさい。
 以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上です...続きを読む

Aベストアンサー

#1です。

>struct tanka_ data { ・・・・(1)
>  int tanka;
>  int kosuu;
>  int kingaku;
>};
・・・途中省略
>} これでいいでしょうか

(1)のところは、変えてはいけません。
struct tanka_kosuu { 
のままにして下さい。
他は、問題ありません。

Qselectの意味

selectの意味

リファレンスマニュアルと本のselectの説明がわかりません。
説明の文はなんとかわかるのですが、引数のとり方が「reads[, writes[, excepts[, timeout]]]」となっていて、これは 3 要素の配列を返しているように見えないので、混乱します。「reads[, writes[], excepts[], timeout[]」という書き方なら3 要素の配列を返していると納得できるのですが、ここで返しているのはreadsの中にwritesがあり、更にその中にtimeoutがある配列を返しているんでしょうか?

手元の本に「selectはリクエストを受信すると、リクエストを検出したソケットだけをリストに返します。」とあるのですが、ここで言うソケットとは入力、出力、例外を指していて、リストというのはつまり配列のことなんでしょうか?

Aベストアンサー

a = hoge.select(ARGS)

の場合に、ARGSの部分が引数です。
ここは、「reads[, writes[, excepts[, timeout]]]」とかかれているので
以下の4種類の書き方ができます。
hoge.select(reads, writes, excepts, timeout)
hoge.select(reads, writes, excepts)
hoge.select(reads, writes)
hoge.select(reads)

また、aに代入される値が戻り値です。
ここには、
「戻り値は、timeout した時には nil を、そうでないときは 3 要素の配列を返し、その各要素が入力/出力/例外待ちのオブジェクトの配列です(指定した配列のサブセット)」
と書かれているので
nil 若しくは [???,???,???]の形で値が代入されます。

これでご理解いただけるのではないでしょうか。

Qin_addrのs_addr?

struct in_addr A;
(struct in_addr)型のAがありまして、Aにデータを代入するとき、よく
A.s_addr = ?????;
というように、「s_addr」というメンバにアクセスしてるサンプルをよく見かけますが、MSDNライブラリによると、

typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} in_addr;

となっていて、「s_addr」のメンバはどこにもないんですよね。。
これはどういうことなんでしょう。
ちなみに自分の発想でアクセスするとしたら、例えばu_longとしてだったら、
A.S_un.S_addr
というようなものしか思いつきません。

あと、ネットワークプログラミング初心者の自分にもわかるような、WinSockについてやさしく、しかもくわしいサイトやおすすめの書籍がありましたら、是非とも教えてください。

struct in_addr A;
(struct in_addr)型のAがありまして、Aにデータを代入するとき、よく
A.s_addr = ?????;
というように、「s_addr」というメンバにアクセスしてるサンプルをよく見かけますが、MSDNライブラリによると、

typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} in_addr;

となっていて、「s_addr」のメンバはどこにもないんですよね。。
こ...続きを読む

Aベストアンサー

bcc32のwinsonk.hをみたら

#define s_addr S_un.S_addr

のようになっていました。
A.S_un.S_addr
って打つのが面倒くさいってことでしょうね。

Qソケットプログラミングで・・

簡単なソケットプログラムを作ろうとしておりまして、サイトで調べたりしておりましたところ、なんとか分かってきたのですが、ひとつどうしてもわからないことがありますので教えていただけますでしょうか。
ソケットから受信するメッセージの生成のところなんですが、
「WSAAsyncSelect(m_socket,m_hWnd,WM_USER_ASYNC_SELECT,FD_READ | FD_WRITE)」
で、2番目の引数「m_hWnd」がわかりません。
教えていただけないでしょうか?よろしくお願いします。

Aベストアンサー

こちらの「III.非同期ソケット通信」のところが参考になりませんか?
WSAAsyncSelect()で、例えば受信データありの場合にイベントとして通知する
ウィンドウのハンドルをここに記述しておき、そのウィンドウのイベント
ハンドラで受信処理を行なうようなプログラミングを可能にします。
http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

参考URL:http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

Qtypedef struct OBJECT NODE; の意味を教えてください。

C言語において、

typedef struct OBJECT NODE;

に、コメント文を付けるとしたらどのようになりますか??
よろしくお願いします。

Aベストアンサー

意味は「これから NODE って出てきたら struct OBJECT と同じことだからね」ということです。

コメントに関してですが、言語に親しんだ人であれば難なく理解できる個所にはコメントを書かないのが良いマナーであると思います。
過剰なコメントは可読性を損ねますから。

この場合はコメントをつけないのが正解だと思いますよ。


人気Q&Aランキング