winsock


国士無双  2009-03-12 08:13:48  No: 69840

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

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

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


επιστημη  URL  2009-03-12 17:40:32  No: 69841

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

とかとか...


仲澤@失業者  2009-03-13 01:19:11  No: 69842

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

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


国士無双  2009-03-13 05:22:34  No: 69843

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

クライアント側です。
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 19:03:11  No: 69844

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

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


subaru  2009-03-13 19:27:14  No: 69845

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


rin  2009-03-13 21:08:22  No: 69846

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

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


国士無双  2009-03-14 06:52:23  No: 69847

いえ、関係ないものでもご回答うれしいです。
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-14 07:41:06  No: 69848

ポートは違いますが…
>  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-15 08:25:16  No: 69849

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

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

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


仲澤@失業者  2009-03-17 01:06:03  No: 69850

う〜む。

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

かなぁ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加