前提・実現したいこと
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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。