ソケットの練習をしています。とりあえず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);
}
No.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
No.3
- 回答日時:
もう少しセオリーに則った記述をしたほうがいいでしょう。
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でも試しました)
No.2
- 回答日時:
#1です。
> 同期、非同期とかって関係ありますか?
TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。
では、サーバ側は、クライアントのconnect()を受け付ける状態になってますか?
サーバ側のプログラムが、accept()でブロックされ、待機していればOKです。
それと、connect()失敗したら、念のためソケットをクローズしてから、リターンがいいかもしれません。
ソケットを正しくクローズせずに終了すると、そのポート番号が使われていないことをシステムが認識するまでに、
しばらく時間がかかります。
どうもありがとうございます。
おっしゃる通りソケットはクローズしました。
>TCPを使ったサーバ-クライアントプログラムで、「同期」ですね。
私のプログラムはウィンドウメッセージは使ってないので非同期ではないのですか?ちょっとこのへんがよくわかりません。
No.1
- 回答日時:
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クライアントのソースをダウンロードして実行してみましたが、それもだめでした。ブラウザなどは正常に動きます。
何か他に原因は考えられるでしょうか?
もしお暇であればお願いします。
(同期、非同期とかって関係ありますか?)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース Flaskでサーバー立ち上げに関して 1 2023/08/12 21:02
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Windows 10 インストールしたてのVirtualBoxの仮想マシンにDHCPで割り振られるIPアドレスにつきまして 1 2023/05/03 14:46
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- UNIX・Linux raspberry piを使ったWebサーバー制作をしています、接続するネットワークを変更したときに 1 2023/01/09 15:57
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6のwinsockでconnectできない
-
VB6‥ソケットについて
-
Javaのソケット通信について初...
-
JavaでBASIC認証突破
-
Macターミナルで実行中のプログ...
-
sendkeysにてALT+CTRL+INSERTを...
-
タスクマネージャーのプロセス...
-
マインスイーパ、自動解析プロ...
-
system関数を使用してsuコマン...
-
VB6.0 SHELLで起動...
-
VBAの配列サイズとメモリに関して
-
H8/OSを用いた割り込みで困って...
-
StrConvの使い方について教えて...
-
C++Builderでペイントソフト
-
起動中のEXCELファイル(EXCEL...
-
closeとメモリの開放について
-
プロセスIDからウィンドウハ...
-
explorer.exeが異様にメモリを食う
-
コアダンプって何ですか?
-
メモリが不足しています(VBA)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信におけるbind関数について
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケット通信 同じポート番号...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
ソケットを用いた1対多通信につ...
-
ソケットでクライアントのipア...
-
ソケットのクローズについて
-
相手のIPアドレスを取得する方法
-
SIPがNATを越えられない理由
-
Socket通信の0バイト受信について
-
CreateFile関数でCOMポートが開...
-
Connectエラーが出てしまう・・...
-
同じLAN内パソコンのIPアドレス...
-
送信したデータの一部が文字化...
おすすめ情報