dポイントプレゼントキャンペーン実施中!

ソケットの練習をしています。とりあえず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);
}

A 回答 (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も記載しておきますね。

参考URL:http://www.nakka.com/lib/inet/index.html
    • good
    • 0
この回答へのお礼

/******感謝*******/
ありがとうございます!!!
やっと繋がりました!
URLも参考になりました。

お礼日時:2003/02/22 13:30

もう少しセオリーに則った記述をしたほうがいいでしょう。



1.エラーチェック
大幅に抜けています。
エラーの種別はWSAGetLastError()で識別してください。
何が起こっているのか?を知る手段となります。

2.WSASatrtupについて
WSAStartupの第一引数はバイトの値です。
通常は
MAKEWROD(2,0)//WinSock2.0の場合
のようにします。
また、関数値とWSADATAをチェックして実際に使用されているWinSockバージョンを確認した方が良いでしょう。
同期型のバークレイソケットは1.1から使えるので、このプログラムでは問題ないとは思いますが…

WSAGetLastError()の関数値でも書いていただけたらもう少し具体的な回答が出来るかもしれません。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。

connect()の前でWSAGetLastError()でエラーは出てませんでした(戻り値は0でした)。

connect()の後でWSAGetLastError()でエラーチェックを行なうと
結果は、WSAEAFNOSUPPORTとなりました。socket()ですでに間違っているということでしょうか?

またバージョンは2.2、状態はRunningです。
WSAStartup()ではMAKEWORD(2,2)かMAKEWORD(2,0)でためしましたが接続できませんでした。

まだ原因がよくわかりません。



リンクしているソケットライブラリはws2_32.libです(wsock32.libでも試しました)

お礼日時:2003/02/21 13:11

#1です。



> 同期、非同期とかって関係ありますか?

TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。

では、サーバ側は、クライアントのconnect()を受け付ける状態になってますか?
サーバ側のプログラムが、accept()でブロックされ、待機していればOKです。

それと、connect()失敗したら、念のためソケットをクローズしてから、リターンがいいかもしれません。
ソケットを正しくクローズせずに終了すると、そのポート番号が使われていないことをシステムが認識するまでに、
しばらく時間がかかります。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
おっしゃる通りソケットはクローズしました。

>TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。

私のプログラムはウィンドウメッセージは使ってないので非同期ではないのですか?ちょっとこのへんがよくわかりません。

お礼日時:2003/02/21 12:56

name.sin_addr=*((in_addr *)*host->h_addr_list);



の部分を、

memcpy( &name.sin_addr, host->h_addr, host->h_length );

では、どうでしょう?
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
おっしゃるように

memcpy( &name.sin_addr, host->h_addr, host->h_length );

としてみましたが同じ結果になりました。
加えて、

memset(name.sin_zero,(int)0,sizeof(name.sin_zero));

と、memcpyの下にしてみましたが無理でした。
インターネット上の簡単なHTTPクライアントのソースをダウンロードして実行してみましたが、それもだめでした。ブラウザなどは正常に動きます。
何か他に原因は考えられるでしょうか?
もしお暇であればお願いします。
(同期、非同期とかって関係ありますか?)

お礼日時:2003/02/20 16:52

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