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

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

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

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

VMware

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

Q&A

解決済

1回答

3453閲覧

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

TOMO6181

総合スコア40

Ubuntu

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

VMware

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

0グッド

0クリップ

投稿2020/06/27 10:19

編集2020/06/28 03:04

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

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

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

・クライアント

C++

1#include <winsock2.h> 2#include <stdio.h> 3#include <iostream> 4#include <string> 5 6#define SEVER_IP_ADDRESSE "192.168.11.8" 7#define SERVER_PORT 12345 8 9#define BUFSIZE 256 10#define RECVSIZE 65536 11 12#define SLEEP_TIME 1 13 14using namespace std; 15 16int main() { 17 18 // セットアップ 19 WSADATA wsaDate; 20 // サーバー情報 21 SOCKADDR_IN server; 22 23 // 初期化 24 WSAStartup(MAKEWORD(2, 0), &wsaDate); 25 26 // ソケット生成 27 int soc; 28 char sendBuf[BUFSIZE]; 29 char recvBuf[RECVSIZE]; 30 int recvLen = 0; 31 32 soc = socket(AF_INET, SOCK_STREAM, 0); 33 34 // サーバーアドレス情報 35 server.sin_family = AF_INET; 36 server.sin_port = htons(SERVER_PORT); 37 server.sin_addr.S_un.S_addr = inet_addr(SEVER_IP_ADDRESSE); 38 39 //// サーバーに接続 40 //if ( connect(soc,(LPSOCKADDR)&server, sizeof(server)) < 0); 41 //{ 42 // printf("サーバーへの接続失敗です%d\n",WSAGetLastError()); 43 // closesocket(soc); 44 // return -1; 45 //} 46 47 // データをサーバーに送信 48 while (true) 49 { 50 string sendText; 51 connect(soc, (LPSOCKADDR)&server, sizeof(server)); 52 53 cin >> sendText; 54 cout << "send:" << sendText << endl; 55 if (send(soc, sendText.c_str(), sendText.size(), 0) == SOCKET_ERROR) 56 { 57 printf("サーバーへの送信失敗です%d\n", WSAGetLastError()); 58 closesocket(soc); 59 sendText.clear(); 60 return -1; 61 } 62 else 63 { 64 // 受信 65 recvLen = recv(soc, recvBuf, RECVSIZE, 0); 66 string receive(recvBuf, recvLen); 67 cout << "receve:" << receive << WSAGetLastError() << endl; 68 } 69 Sleep(SLEEP_TIME); 70 71 } 72 73 // 終了 74 closesocket(soc); 75 WSACleanup(); 76 return 0; 77} 78

・サーバー側

C++

1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/socket.h> 4#include <netinet/in.h> 5#include <arpa/inet.h> 6#include <unistd.h> 7#include <memory.h> 8 9#define SERVER_PORT 12345 10#define BUFSIZE 1024 11 12int main() 13{ 14 15 int socfd; // サーバー側のソケット 16 int client_soc; // クライアント側のソケット 17 struct sockaddr_in addr; // アドレスを入れる箱 18 19 FILE* fp; 20 21 socklen_t len = sizeof(struct sockaddr_in); 22 struct sockaddr_in from_addr; 23 24 char buf[BUFSIZE]; 25 26 // 受信バッファ初期化 27 memset(buf,0,sizeof(buf)); 28 29 // ソケット生成 30 if((socfd = socket(AF_INET,SOCK_STREAM,0)) < 0) 31 { 32 perror("socket"); 33 } 34 35 // 待ち受け用IP・ポート番号設定 36 //アドレスファミリ IPV4 37 // ポート番号 11110 38 addr.sin_family = AF_INET; 39 addr.sin_port = htons(SERVER_PORT); 40 addr.sin_addr.s_addr = INADDR_ANY; 41 42 // バインド 43 if(bind(socfd,(struct sockaddr *)&addr,sizeof(addr)) < 0) 44 { 45 perror("bind"); 46 } 47 48 // 受信待ち 49 // listen(接続待ちソケット,バックログ(接続を待機させる最大数)) 50 if(listen(socfd,SOMAXCONN) < 0) 51 { 52 perror("listen"); 53 } 54 55 56 // 受信 57 int rsize; 58 while(1) 59 { 60 // クライアントからのコネクト要求待ち 61 if((client_soc = accept(socfd,(struct sockaddr*)&from_addr,&len)) < 0) 62 { 63 perror("accept"); 64 } 65 // rsize = recv(client_soc,buf,sizeof(buf),0); 66 67 while(rsize = read(client_soc ,buf , sizeof(buf)) > 0 ) 68 { 69 fp = fopen("ScoreData.txt","a"); 70 71 if(fp == NULL) 72 { 73 perror("ファイルの読み込みに失敗\n"); 74 return -1; 75 } 76 77 78 fprintf(fp,"%s",buf); 79 fclose(fp); 80 81 //Send the message back to client 82 write(client_soc , buf , strlen(buf)); 83 memset( &buf, 0, sizeof(buf)); 84 } 85 86 if(rsize == 0) 87 { 88 puts("Client disconnected"); 89 fflush(stdout); 90 } 91 else if(rsize == -1) 92 { 93 perror("recv failed"); 94 } 95 96 } 97 98 // ソケットクローズ 99 close(client_soc); 100 close(socfd); 101 102 return 0; 103}

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

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

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

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

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

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

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

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

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

Daregada

2020/06/27 11:12

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

2020/06/28 03:18

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

回答1

0

ベストアンサー

VMWareのネットワークアダプタをブリッジにすると、ゲストは直接ホスト側のネットワークに接続してる状態となります。
まずはそれでソケット接続を試してはどうでしょうか

投稿2020/06/27 13:48

y_waiwai

総合スコア88042

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

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

TOMO6181

2020/06/28 03:16

御回答ありがとうございます。 VMWareのネットワークアダプタをブリッジに設定して、「物理ネットワーク接続の状態を複製」にチェックを入れ、クライアント側のコードを以下のように変更したら正常に動作するようになりました。 1.SEVER_IP_ADDRESSEを、ブリッジ接続時にサーバー側でifconfigして表示されたアドレスに変更。 2.connect関数で、何故か正常に接続しても-1が返ってreturn-1のルートに入っていたので、コメントアウト
Daregada

2020/06/28 04:04

コメントにする前の「WSAGetLastError()」は何を返してきたんですか?
TOMO6181

2020/06/28 12:17

WSAGetLastErrorは、0が返ってきていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問