こんばんは。
今、winsockを使ってhtmlを得るプログラムを作っています。
ですが、connect()関数で失敗してしまい、WSAGetLastError();からは10022のエラーが返されます。
しかし、引数をデバックで見てみても値がおかしいようには見えません。
引数以外にどのような原因が考えられるか、どなたかご存知ないでしょうか?
・ listen()を呼び出さずにaccept()を呼び出した。
・ バインド済みのソケットに対してbind()しようとした。
・ listen()で待機中のソケットでconnect()しようとした。
・ 関数に渡されたパラメータに無効な値が含まれている。
とかとか...
>引数以外にどのような原因が考えられるか、どなたかご存知ないでしょうか?
サーバーアプリ側かクライアントアプリ側かが明記してあると
もちっと絞れるかも。つまり、listen()側かconnect()側か
ということです。
返事が遅くなって申し訳ありません。
クライアント側です。
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に入っている値も正しい事は確認しました。
よろしくお願いします。
>Sv.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);
Sv.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list[0]);
では?
ごめん。関係なかったです。
念のためSvの値も初期化してみるとか。
10022ってことは引数エラーですよね
SOCKADDRやSOKETの宣言あたりから、connectするまで(WSAGetLastErrorも)
関係ある部分を全部提示してみてはいかがでしょうか?
いえ、関係ないものでもご回答うれしいです。
Svの値は初期化しています。
関係ある部分で可能性があるのは、
sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
くらいかと。
socket();
gethostbyname();
connect();
で
WSAGetLastError();をおこなっていますが、connectの後に初めてエラーを返します。
ここで疑問に思ったのですが、
既に、IPPROTO_TCPのソケットが存在している場合にsocket(AF_INET,SOCK_STREAM,IPPROTO_TCP)で得たソケットハンドルは有効ですか?
初歩的な質問ですいません。
ポートは違いますが…
> 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使ってます。
有効ですか。
となると原因がまったくわからないですね。
一応、1.1にしてためしましたが、やはりダメですね。
念の為、サーバーのほうを作って、ポート80以外で試してみます。
試した結果によっては、また知恵をお借りにくるかもしれないので、そのときはまたよろしくお願いします。
う〜む。
1.当該のソケットを、どっかでlisten()
しちゃってるのではないか。というのを
もう一回疑ってみる。
2.socket( 2, 1, 0)にしてみる。
3.ポートを変えてみる
かなぁ。
ツイート | ![]() |