- ベストアンサー
Winsockプログラムの初歩的質問(connect()がうまくいかない)
ソケットの練習をしています。とりあえずconnect()で通信経路を確立するところまでを書いたつもりですが、以下プログラムを実行すると「サーバーソケットに接続失敗」となります。 とりあえずprintf()でチェックしたところsocket()まではうまくいっているようです。 環境:Win2000 , VC++6.0 , LAN接続でDHCP→学内サーバー です。 よろしくお願いします。 #include<winsock2.h> #include<stdio.h> int main() { WSADATA wsaData; struct hostent *host; SOCKET sock1; SOCKADDR_IN name; WSAStartup(2 , &wsaData); host=gethostbyname("www.goo.ne.jp"); //gooのIPアドレスを取得 sock1 = socket(AF_INET,SOCK_STREAM,0); //ソケット生成 /**ここからがあやしい**/ name.sin_port=htons(80); name.sin_addr=*((in_addr *)*host->h_addr_list); if(connect(sock1,(PSOCKADDR)&name,sizeof(name))){ printf("サーバーソケットに接続失敗\n"); return 0; } WSACleanup(); return(0); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
SOCKADDR_IN構造体のsin_familyメンバに 値がセットされてないようですが これが入っていない関係でうまく動作していないのでは ないでしょうか? > /**ここからがあやしい**/ > name.sin_port=htons(80); > name.sin_addr=*((in_addr *)*host->h_addr_list); 上記の部分に下記のコードを追加してみてください。 name.sin_family = AF_INET; ついでに参考URLも記載しておきますね。
その他の回答 (3)
- toysmith
- ベストアンサー率37% (570/1525)
もう少しセオリーに則った記述をしたほうがいいでしょう。 1.エラーチェック 大幅に抜けています。 エラーの種別はWSAGetLastError()で識別してください。 何が起こっているのか?を知る手段となります。 2.WSASatrtupについて WSAStartupの第一引数はバイトの値です。 通常は MAKEWROD(2,0)//WinSock2.0の場合 のようにします。 また、関数値とWSADATAをチェックして実際に使用されているWinSockバージョンを確認した方が良いでしょう。 同期型のバークレイソケットは1.1から使えるので、このプログラムでは問題ないとは思いますが… WSAGetLastError()の関数値でも書いていただけたらもう少し具体的な回答が出来るかもしれません。
お礼
どうもありがとうございます。 connect()の前でWSAGetLastError()でエラーは出てませんでした(戻り値は0でした)。 connect()の後でWSAGetLastError()でエラーチェックを行なうと 結果は、WSAEAFNOSUPPORTとなりました。socket()ですでに間違っているということでしょうか? またバージョンは2.2、状態はRunningです。 WSAStartup()ではMAKEWORD(2,2)かMAKEWORD(2,0)でためしましたが接続できませんでした。 まだ原因がよくわかりません。 リンクしているソケットライブラリはws2_32.libです(wsock32.libでも試しました)
- Damsel
- ベストアンサー率37% (18/48)
#1です。 > 同期、非同期とかって関係ありますか? TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。 では、サーバ側は、クライアントのconnect()を受け付ける状態になってますか? サーバ側のプログラムが、accept()でブロックされ、待機していればOKです。 それと、connect()失敗したら、念のためソケットをクローズしてから、リターンがいいかもしれません。 ソケットを正しくクローズせずに終了すると、そのポート番号が使われていないことをシステムが認識するまでに、 しばらく時間がかかります。
お礼
どうもありがとうございます。 おっしゃる通りソケットはクローズしました。 >TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。 私のプログラムはウィンドウメッセージは使ってないので非同期ではないのですか?ちょっとこのへんがよくわかりません。
- Damsel
- ベストアンサー率37% (18/48)
name.sin_addr=*((in_addr *)*host->h_addr_list); の部分を、 memcpy( &name.sin_addr, host->h_addr, host->h_length ); では、どうでしょう?
お礼
どうもありがとうございます。 おっしゃるように memcpy( &name.sin_addr, host->h_addr, host->h_length ); としてみましたが同じ結果になりました。 加えて、 memset(name.sin_zero,(int)0,sizeof(name.sin_zero)); と、memcpyの下にしてみましたが無理でした。 インターネット上の簡単なHTTPクライアントのソースをダウンロードして実行してみましたが、それもだめでした。ブラウザなどは正常に動きます。 何か他に原因は考えられるでしょうか? もしお暇であればお願いします。 (同期、非同期とかって関係ありますか?)
お礼
/******感謝*******/ ありがとうございます!!! やっと繋がりました! URLも参考になりました。