winsock


国士無双  2009-03-11 23:13:48  No: 69840  IP: [192.*.*.*]

こんばんは。
今、winsockを使ってhtmlを得るプログラムを作っています。

ですが、connect()関数で失敗してしまい、WSAGetLastError();からは10022のエラーが返されます。
しかし、引数をデバックで見てみても値がおかしいようには見えません。

引数以外にどのような原因が考えられるか、どなたかご存知ないでしょうか?

編集 削除
επιστημη  URL  2009-03-12 08:40:32  No: 69841  IP: [192.*.*.*]

・ listen()を呼び出さずにaccept()を呼び出した。 
・ バインド済みのソケットに対してbind()しようとした。 
・ listen()で待機中のソケットでconnect()しようとした。 
・ 関数に渡されたパラメータに無効な値が含まれている。  

とかとか...

編集 削除
仲澤@失業者  2009-03-12 16:19:11  No: 69842  IP: [192.*.*.*]

>引数以外にどのような原因が考えられるか、どなたかご存知ないでしょうか?

サーバーアプリ側かクライアントアプリ側かが明記してあると
もちっと絞れるかも。つまり、listen()側かconnect()側か
ということです。

編集 削除
国士無双  2009-03-12 20:22:34  No: 69843  IP: [192.*.*.*]

返事が遅くなって申し訳ありません。

クライアント側です。
connect(sock,(SOCKADDR *)&Sv,sizeof(Sv));
を呼び出した時に失敗します。

引数の値は、
Sv.sin_family = AF_INET;
Sv.sin_port = htons(80);
Sv.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);
のようにしてあり、
Sv.sin_addrに入っている値も正しい事は確認しました。

よろしくお願いします。

編集 削除
subaru  2009-03-13 10:03:11  No: 69844  IP: [192.*.*.*]

>Sv.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);

Sv.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list[0]);
では?

編集 削除
subaru  2009-03-13 10:27:14  No: 69845  IP: [192.*.*.*]

ごめん。関係なかったです。
念のためSvの値も初期化してみるとか。

編集 削除
rin  2009-03-13 12:08:22  No: 69846  IP: [192.*.*.*]

10022ってことは引数エラーですよね

SOCKADDRやSOKETの宣言あたりから、connectするまで(WSAGetLastErrorも)
関係ある部分を全部提示してみてはいかがでしょうか?

編集 削除
国士無双  2009-03-13 21:52:23  No: 69847  IP: [192.*.*.*]

いえ、関係ないものでもご回答うれしいです。
Svの値は初期化しています。


関係ある部分で可能性があるのは、
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
くらいかと。

socket();
gethostbyname();
connect();

WSAGetLastError();をおこなっていますが、connectの後に初めてエラーを返します。

ここで疑問に思ったのですが、
既に、IPPROTO_TCPのソケットが存在している場合にsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP)で得たソケットハンドルは有効ですか?

初歩的な質問ですいません。

編集 削除
瀬戸っぷ  2009-03-13 22:41:06  No: 69848  IP: [192.*.*.*]

ポートは違いますが…
>  addr.sin_addr.s_addr = ServerAddress;
>  addr.sin_family = AF_INET;
>  addr.sin_port = htons(ServerPort);
>  memset(addr.sin_zero, static_cast<int>(0), sizeof(addr.sin_zero));
で繋がってます。
ServerAddressはconst unsigned longです。

>既に、IPPROTO_TCPのソケットが存在している場合にsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP)で得たソケットハンドルは有効ですか?

別のソケットハンドルとして作成されるはずですから有効かと思われます。
ちなみに私はsocket(PF_INET, SOCK_STREAM, 0)で作成していますが。
PF_INETとAF_INETは同じモノ…ですので違いは第3引数だけでしょうか。
WSAStartup(MAKEWORD(1, 1), &wsaDat)でwinsock 1.1使ってます。

編集 削除
国士無双  2009-03-14 23:25:16  No: 69849  IP: [192.*.*.*]

有効ですか。
となると原因がまったくわからないですね。

一応、1.1にしてためしましたが、やはりダメですね。
念の為、サーバーのほうを作って、ポート80以外で試してみます。

試した結果によっては、また知恵をお借りにくるかもしれないので、そのときはまたよろしくお願いします。

編集 削除
仲澤@失業者  2009-03-16 16:06:03  No: 69850  IP: [192.*.*.*]

う〜む。

1.当該のソケットを、どっかでlisten()
    しちゃってるのではないか。というのを
    もう一回疑ってみる。
2.socket( 2, 1, 0)にしてみる。
3.ポートを変えてみる

かなぁ。

編集 削除