🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

2878閲覧

OSとVisualStudioをアップデートしたらTCP/IP通信でconnect()がタイムアウトするようになった

tsukamaru

総合スコア0

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

タイムアウト

タイムアウトはイベント発生から完了までに掛かる経過時間に対する一定の待ち時間を指します。また、特定の時間が経過された場合に発生するイベントを指すこともあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/01/20 08:06

前提・実現したいこと

C++でTCP/IP通信を行うプログラムがあり、クライアント側のPCを変更した際にconnectがタイムアウトするようになってしまいました。サーバ側のPCはいろいろな都合があり、変更できません。

OSやVisual Studio のバージョンの違いが影響しているのではないかと思ったのですが、調べても分かりませんでした。
初心者のため、至らぬ点が多くあるかとは思いますが、対応策などありましたらご教授いただけると幸いです。

発生している問題・エラーメッセージ

WSAGetLastError() connect:10060

該当のソースコード

クライアント側

C++

1SOCKET s; //ソケット 2//接続するサーバの情報 3struct sockaddr_in dest; 4//接続するサーバのIPアドレス 5char destination[] = "xxx.xxx.xxx.xxx";// ServerのIP 6char buffer[1024]; 7 8float recvdata[6]; 9float senddata[18]; 10 11bool access; 12 13//ソケット通信の準備 14WSADATA data; 15WSAStartup(MAKEWORD(2,0), &data); 16 17//接続先(サーバ)のアドレス情報を設定 18memset(&dest, 0, sizeof(dest)); 19//ポート番号はサーバプログラムと共通 20dest.sin_port = htons(7777); 21dest.sin_family = AF_INET; 22dest.sin_addr.s_addr = inet_addr(destination); 23 24//ソケットの生成 25s = socket(AF_INET, SOCK_STREAM, 0); 26if (s == INVALID_SOCKET) { 27 printf("socket : %d\n", WSAGetLastError()); 28 return 1; 29 } 30//サーバへの接続 31if(connect(s, (struct sockaddr *) &dest, sizeof(dest)) != 0){ 32 printf("connect : %d\n", WSAGetLastError()); 33 access = false; 34 } 35 else{ 36 access = true; 37 } 38 39 while(access) 40 { 41 Sleep(10); 42 //サーバにデータを送信 43 send(s, (char *)&senddata, sizeof(senddata), 0); 44 //サーバからデータを受信 45 recv(s, (char *)&recvdata, sizeof(recvdata), 0); 46 47 } 48 closesocket(s); 49 WSACleanup(); 50

サーバ側

C++

1 int result; //戻り値 2 //接続を許可するクライアント端末の情報 3 struct sockaddr_in source; 4 char buffer[1024]; //受信データのバッファ領域 5 char ret; 6 float recvdata[18]; 7 float sendData[6]; 8 //bufferを0で初期化 9 memset(&buffer, '\0', sizeof(buffer)); 10 11 //送信元の端末情報を登録する 12 //ポート番号はクライアントプログラムと共通 13 memset(&source, 0, sizeof(source)); //初期化 14 source.sin_family = AF_INET; 15 source.sin_port = htons(7777); 16 source.sin_addr.s_addr = htonl(INADDR_ANY); 17 18 //ソケット通信の開始準備 19 pDlg -> m_TextComment.SetWindowText("ソケット通信の開始準備"); 20 WSADATA data; 21 result = WSAStartup(MAKEWORD(2, 0), &data); 22 if (result < 0){ 23 pDlg -> m_TextComment.SetWindowText("ソケット通信準備エラー"); 24 } 25 26 //ソケットの生成 27 pDlg-> m_TextComment.SetWindowText("ソケットの生成\n"); 28 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 29 if (s < 0){ 30 pDlg-> m_TextComment.SetWindowText("ソケット生成エラー\n"); 31 } 32 33 //ソケットのバインド 34 pDlg-> m_TextComment.SetWindowText("ソケットのバインド\n"); 35 result = bind(s, (struct sockaddr *)&source, sizeof(source)); 36 if (result < 0){ 37 38 pDlg-> m_TextComment.SetWindowText("バインドエラー\n"); 39 40 m_AcceptServer = false; 41 42 } 43 44 //接続の許可 45 pDlg-> m_TextComment.SetWindowText("接続の許可\n"); 46 result = listen(s, 1); 47 if (result < 0){ 48 pDlg-> m_TextComment.SetWindowText("接続許可エラー\n"); 49 50 m_AcceptServer = false; 51 52 } 53 54 55 //クライアントから通信があるまで待機 56 // pDlg-> m_TextComment.SetWindowText("クライアントから通信があるまで待機\n"); 57 s1 = accept(s, NULL, NULL); 58 if (s1 < 0) 59 { 60 pDlg-> m_TextComment.SetWindowText("待機エラー\n"); 61 62 m_AcceptServer = false; 63 64 } 65 66 while(m_AcceptServer) 67 { 68 Sleep(25); 69 70 //クライアントから送信されたデータの受信 71 result = recv(s1, (char *)&recvdata, sizeof(recvdata), 0); 72 73 send(s1,(char *)&sendData, sizeof(sendData), 0); 74 75 pDlg-> m_conect_error.SetWindowText("ON"); 76} 77 closesocket(s1); 78 closesocket(s); 79 pDlg-> m_conect_error.SetWindowText("OFF"); 80 81 //ソケット通信の終了 82 WSACleanup(); 83

試したこと

ファイアウォール設定の変更
(受信の規則・送信の規則の追加)

補足情報(FW/ツールのバージョンなど)

クライアント側
旧PC(32bit)
OS:Windows7
VisualStudio2010
VC++ 6 project
現PC(64bit)
OS:Windows10
VisualStudio2019

サーバ側(32bit)
OS:Windows7
VisualStudio2010
VC++ 6 project

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

回答いただきありがとうございました。

皆さんのアドバイスを参考にファイヤーウォールの設定やアンチウイルスソフトの無効化などをしましたが、最終的にはサーバーとクライアントでそれぞれ異なるWi-Fiで接続していたのをそろえたところconnectができました。浅学で申し訳ありません…今後も勉強していきたいと思います。

投稿2021/01/20 11:07

tsukamaru

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

PCが変わったとの事ですが、まずサーバと通信する事自体は可能ですか?(pingが応答するか等)
また、ファイアウォールか何かによって通信ポートがブロックされている事はないでしょうか。

投稿2021/01/20 08:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukamaru

2021/01/20 10:01 編集

回答ありがとうございます。 pingの応答を見たところ、サーバ側からクライアント側への送信はできましたが、クライアント側からサーバ側への送信はできませんでした。 しかし、変更前のクライアント側PCでもpingは応答がなかったのですが通信できていました… ファイアウォールの設定はすべてのポートで接続を許可する設定にしたのですが、繋がりませんでした。
退会済みユーザー

退会済みユーザー

2021/01/20 10:03

サーバからクライアントへping通るって事は、一応通信出来ない状態って訳ではなさそうですね
guest

0

PCを変更してIPが変わってしまったってことはないでしょうか
そこらへん確認してみては

投稿2021/01/20 08:08

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukamaru

2021/01/20 08:23

回答ありがとうございます。 サーバ側はPCを変えていないためIPアドレスは変わっていませんでした。クライアント側PCのIPアドレスはあまり関係ないと思っていたのですがなにか問題がありそうでしょうか…
y_waiwai

2021/01/20 08:30

コードを見る限り、あまりOSやVSのバージョンでどーこーというのはないと思います。 ディフェンダとかファイアウオールソフト、アンチウィルスソフトの設定周りはどうでしょうか
tsukamaru

2021/01/20 11:09

OSやVSのバージョンの問題ではないことが分かってとても助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問