質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

解決済

VMWare上のUbuntuとWindows間でソケット通信を行うには

TOMO6181
TOMO6181

総合スコア0

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。

1回答

0評価

0クリップ

87閲覧

投稿2020/06/27 10:19

編集2022/01/12 10:58

VMWareの仮想環境上に構築したUbuntuとWindows間でソケット通信を行おうとしています。
環境は以下の通りです。
OS:Ubuntu-ja-20.04(こちらから入手)

<クライアント側>
・OS:Windows10 Home
・VMWare:Ver.15.5.6
・VisualStudio:Express 2013

実行したコードは以下です。(こちらのコードを参考。)

・クライアント

C++

#include <winsock2.h> #include <stdio.h> #include <iostream> #include <string> #define SEVER_IP_ADDRESSE "192.168.74.128" #define SERVER_PORT 12345 #define BUFSIZE 256 #define RECVSIZE 65536 #define SLEEP_TIME 1 using namespace std; int main() { // セットアップ WSADATA wsaDate; // サーバー情報 SOCKADDR_IN server; // 初期化 WSAStartup(MAKEWORD(2, 0), &wsaDate); // ソケット生成 int soc; char sendBuf[BUFSIZE]; char recvBuf[RECVSIZE]; int recvLen = 0; soc = socket(AF_INET, SOCK_STREAM, 0); // サーバーアドレス情報 server.sin_family = AF_INET; server.sin_port = htons(SERVER_PORT); server.sin_addr.S_un.S_addr = inet_addr(SEVER_IP_ADDRESSE); // サーバーに接続 if ( connect(soc,(LPSOCKADDR)&server, sizeof(server)) < 0); { printf("サーバーへの接続失敗です%d\n",WSAGetLastError()); closesocket(soc); return -1; } // データをサーバーに送信 while (true) { string sendText; connect(soc, (LPSOCKADDR)&server, sizeof(server)); cin >> sendText; cout << "send:" << sendText << endl; if (send(soc, sendText.c_str(), sendText.size(), 0) == SOCKET_ERROR) { printf("サーバーへの送信失敗です%d\n", WSAGetLastError()); closesocket(soc); sendText.clear(); return -1; } else { // 受信 recvLen = recv(soc, recvBuf, RECVSIZE, 0); string receive(recvBuf, recvLen); cout << "receve:" << receive << WSAGetLastError() << endl; } Sleep(SLEEP_TIME); } // 終了 closesocket(soc); WSACleanup(); return 0; }

・サーバー側

C++

#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <memory.h> #define SERVER_PORT 12345 #define BUFSIZE 1024 int main() { int socfd; // サーバー側のソケット int client_soc; // クライアント側のソケット struct sockaddr_in addr; // アドレスを入れる箱 FILE* fp; socklen_t len = sizeof(struct sockaddr_in); struct sockaddr_in from_addr; char buf[BUFSIZE]; // 受信バッファ初期化 memset(buf,0,sizeof(buf)); // ソケット生成 if((socfd = socket(AF_INET,SOCK_STREAM,0)) < 0) { perror("socket"); } // 待ち受け用IP・ポート番号設定 //アドレスファミリ IPV4 // ポート番号 11110 addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); addr.sin_addr.s_addr = INADDR_ANY; // バインド if(bind(socfd,(struct sockaddr *)&addr,sizeof(addr)) < 0) { perror("bind"); } // 受信待ち // listen(接続待ちソケット,バックログ(接続を待機させる最大数)) if(listen(socfd,SOMAXCONN) < 0) { perror("listen"); } // 受信 int rsize; while(1) { // クライアントからのコネクト要求待ち if((client_soc = accept(socfd,(struct sockaddr*)&from_addr,&len)) < 0) { perror("accept"); } // rsize = recv(client_soc,buf,sizeof(buf),0); while(rsize = read(client_soc ,buf , sizeof(buf)) > 0 ) { fp = fopen("ScoreData.txt","a"); if(fp == NULL) { perror("ファイルの読み込みに失敗\n"); return -1; } fprintf(fp,"%s",buf); fclose(fp); //Send the message back to client write(client_soc , buf , strlen(buf)); memset( &buf, 0, sizeof(buf)); } if(rsize == 0) { puts("Client disconnected"); fflush(stdout); } else if(rsize == -1) { perror("recv failed"); } } // ソケットクローズ close(client_soc); close(socfd); return 0; }

上記クライアント側の「SEVER_IP_ADDRESSE "192.168.74.128"」は、サーバーでifconfigで出てきたブロードキャストのアドレスです。

Ubuntuでサーバー側のコードを実行し、クライアントからのコネクト要求待ちをするaccept関数のところで待ち状態になります。
この状態で、Windows側でクライアント側のコードを実行すると、サーバーに接続するconnect関数のところで失敗し、「サーバーへの接続失敗です」のメッセージが出力されます。
サーバーのIPアドレスかポート番号が間違っていると思い、以下を試しました。

1.VMWareの設定でネットワークアダプタの設定をブリッジに設定
2.VMWareの設定でネットワークの設定をNATに設定、シリアルポートで「物理シリアルポートを使用する」を選択

1,2を行ったのですが、いずれも現象は同じでした。
VmWareのIPアドレスとポートはどうやって設定するか、また、それ以外につながらない原因はあるが分かる方がおられましたら、宜しくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Daregada
Daregada

2020/06/27 11:12

まずはクライアント(Windows)からサーバー側にpingでも打ってみればいいのでは。
TOMO6181
TOMO6181

2020/06/28 03:18

御回答ありがとうございます。 VMWareのネットワークアダプタの設定をブリッジ接続にして、pingコマンドを打ったら正常に応答が返ってくるのを確認できました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

VMware

VMwareとは、 ハードウェアで動作するOS上で仮想マシンを作成、実行するソフトウェアです。 Windows上でUNIX系OSを動作させたり、他のOS上で別の仮想OSを動作することが可能です。