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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

解決済

3回答

2668閲覧

windows-linux間の通信

Takumi_s

総合スコア13

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

0クリップ

投稿2018/12/11 07:06

編集2018/12/11 07:11

windowsとvirtualbox上のcentos間を通信させたいのですが,上手くいきません.

Windows-Linux間をTCPで通信するを参考にしたのですが,クライアント側であるwindows側で受信ができていません.

問題として何が考えられるのでしょうか?

構成

  • server :CentOS 7, x86_64(64bit) on Virtualbox
  • client :Windows10 (64bit)

CentOS および virtualbox は現時点で最新のものをインストールしました(したつもりです).

仮想マシン設定1
仮想マシン設定2

クライアント側

visual studio 2017 でビルドしています.

c++

1#include "stdafx.h" 2 3#include <stdio.h> 4#include <winsock.h> 5 6#define PORT_NO_SERVER (12345) 7#define IP_ADDRESS_SERVER "192.168.55.254" 8 9int main(void) 10{ 11 WSADATA wsaData; 12 struct sockaddr_in server; 13 SOCKET sfd = -1; 14 char buf[32] = { 0 }; 15 int rc = 0; 16 17 WSAStartup(MAKEWORD(2, 0), &wsaData); 18 19 sfd = socket(AF_INET, SOCK_STREAM, 0); 20 21 server.sin_family = AF_INET; 22 server.sin_port = htons(PORT_NO_SERVER); 23 server.sin_addr.S_un.S_addr = inet_addr(IP_ADDRESS_SERVER); 24 25 rc = connect(sfd, (struct sockaddr *)&server, sizeof(server)); 26 if (rc < 0) { 27 printf("connect() failed(%d)\n", rc); 28 exit(EXIT_FAILURE); 29 } 30 while (1) { 31 memset(buf, 0, sizeof(buf)); 32 int rs = recv(sfd, buf, sizeof(buf), 0); 33 34 printf("recv %d byte, %s\n", rs, buf); 35 } 36 37 WSACleanup(); 38 39 return 0; 40}

windows側から見たvirtualbox host-only network.
host-only network

サーバ側

centos 上の VSCode でプログラムを記述し,gcc でコンパイルしました.

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <unistd.h> 5#include <sys/types.h> 6#include <sys/socket.h> 7#include <netinet/in.h> 8#include <errno.h> 9 10#define MAX_CLIENTS (1) 11#define MSGBUF_SIZE (1024) 12 13int main(void) 14{ 15 int sfd = -1; 16 struct sockaddr_in client; 17 int socklen = sizeof(client); 18 int ac_sfd = -1; 19 int rc = 0; 20 21 struct sockaddr_in addr = { 22 .sin_family = AF_INET, 23 .sin_port = htons(12345), 24 .sin_addr = { 25 .s_addr = INADDR_ANY, 26 }, 27 }; 28 29 /* ソケットの作成 */ 30 sfd = socket(AF_INET, SOCK_STREAM, 0); 31 if (sfd < 0) { 32 perror("socket"); 33 goto error_end; 34 } 35 36 rc = bind(sfd, (struct sockaddr *)&addr, sizeof(addr)); 37 if (rc < 0) { 38 perror("bind"); 39 goto close_sfd_end; 40 } 41 42 rc = listen(sfd, MAX_CLIENTS); 43 if (rc < 0) { 44 perror("listen"); 45 goto close_sfd_end; 46 } 47 48 /* 要求受付 */ 49 ac_sfd = accept(sfd, (struct sockaddr *)&client, &socklen); 50 if (ac_sfd < 0) { 51 perror("accept"); 52 goto close_sfd_end; 53 } 54 55 while (1) { 56 /* メッセージ送信 */ 57 char msgbuf[MSGBUF_SIZE] = "HELLO WORLD!"; 58 ssize_t ws = write(ac_sfd, msgbuf, strlen(msgbuf)); 59 if (ws < 0) { 60 perror("write"); 61 goto close_all_end; 62 } 63 64 sleep(1); 65 } 66 67 close_all_end: 68 close(ac_sfd); 69 close_sfd_end: 70 close(sfd); 71 error_end: 72 73 return 0; 74}
  • (VSCode上でいくつかのヘッダファイルを開けないと言われているが関係ある???)

⇒stdio.hも該当しているのですが,以前IDEを用いないでcのプログラムをコンパイルした際に,特に併せてコンパイルしなくても機能を利用できたため関係ないと考えています.

  • windows -> centos の ping は通っている
  • centos -> windows の ping は通らない

→ネットワーク構成の問題?
以前質問させていただいた,ネットワーク構成についての疑問

ip
ip設定

以上,お気づきの点がございましたらお教えください.
よろしくお願いいたします.

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

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

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

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

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

keicha_hrs

2018/12/11 07:20 編集

192.168.55.254というアドレスはどこから出てきたのですか?CentOS側にそのIPアドレスが割り当てられたアダプターは見当たらないように思えるのですが。Windows→CentOS方向のpingは通ったとのことですが、それは前述のアドレス宛てでの確認なのでしょうか?
Takumi_s

2018/12/11 07:30

~.254のアドレスについては参考サイトのソースを少し改良したものです.参考サイトを読む限り,サーバ側のアダプタのアドレスが192.168.100.254となっていることから,クライアント側のソースではそちらのアダプタにアクセスするという形になっていると理解しました.なので,私の方でもサーバ側のアダプタに192.168.55.254を手動で割り当てて実行してみたのですが上手くいきませんでした.また,pingに関しては,host-only network アダプタに割り当てられたIPに対してのみpingが通っている状況です.
keicha_hrs

2018/12/11 07:36

参考にしたページでは、仮想マシン側のホストオンリーネットワークのアダプターを.254に手動設定しているものと思います。ご質問の環境ではenp0s8は.200に割り当てられていますので、Windows側のプログラムのアドレスを.200に変更することで通らないでしょうか?
Takumi_s

2018/12/11 07:40

つまり,クライアント側で指定するアドレスはhost-only networkアダプタのアドレスということでよろしいでしょうか?
Takumi_s

2018/12/11 07:42

仰られたとおりにクライアント側で192.168.55.200を指定してみたのですが,通りませんでした.この場合,このソースコードやVB側のネットワーク設定だけでなく,ホストマシンのファイヤウォールの設定なども疑わしいのでしょうか?
keicha_hrs

2018/12/11 08:06 編集

どちらのプログラムでも何かしらエラーメッセージは表示されていないのでしょうか?また、サーバープログラムの方は「一度接続があってメッセージを送ったら終了」という構造になっているようですが、サーバーが終了している状態でクライアントを動かしたということはないですか?
Takumi_s

2018/12/11 08:26

まず,エラーメッセージに関しては,クライアント側のexeをcmdから起動した際にいずれの場合にいおいても「connect() failed(-1)」が出力され,プログラムが終了します.一方で,クライアント側においてはエラーメッセージ等は出ておりません.また,サーバ停止/起動の両状態においてクライアント側プログラムを実行してみたのですが,その際サーバ側では何も出力されず,待ち状態が続き,クライアント側では前述のメッセージが出力されるという状況です
keicha_hrs

2018/12/11 09:56 編集

Windows側のファイアウォールが原因の可能性はあると思います。そうだとしたら、それを解消しないとアダプターが何であっても繋がらないかもしれませんね。手元で確認できないため確実なことは言えないので、申し訳ありません。
Takumi_s

2018/12/13 00:45

ありがとうございました
guest

回答3

0

プログラムの問題か、環境の問題か切り分けるために、出来合のプログラムで、通信してみましょう。

クライアントは、Windows標準のtelnet.exeで。標準だと有効になってないかも知れません。

サーバー側はLinux側なので何とでもなると思いますが、Pythonは入ってそうなので、
python -m SimpleHTTPServer ポート番号で起動して、Windowsから、telnet IPアドレス ポート番号で、繋がれば入力待ちになるし、繋がらなければエラーメッセージが出ます。
入力待ちになれば、GET / HTTP/1.0 Enter Enterで(デフォルトだと、入力文字はエコーバックされません)。

投稿2018/12/11 08:32

otn

総合スコア84423

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

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

Takumi_s

2018/12/13 00:44

まずはそこからやってみます
guest

0

まずはVirtualBoxのネットワークアダプタをブリッジにして、ゲストをホスト側のネットワークに参加させて通信させればいいかと。

投稿2018/12/11 07:09

y_waiwai

総合スコア87719

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

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

Takumi_s

2018/12/11 07:19

ネットワークアダプターとして新しくブリッジアダプターを追加し,そのアドレスをクライアント側のソースで指定するという形でよろしいでしょうか? 現状,ソケットプログラミングについて学び始めたばかりで,クライアント側で指定すべきアドレスがどれなのかよくわかっていな状況です.
keicha_hrs

2018/12/11 07:22 編集

ホストオンリーアダプターが正しく機能しているならホストゲスト間での双方向での通信は通るはずですし、ブリッジアダプターでの接続確認が必要な案件とは思えません。
y_waiwai

2018/12/11 07:23

他のアダプタは削除して、ブリッジアダプタだけにしといたほうがややこしくはないかと。 ゲストもIPを自動取得させるようにして、ホストにつながってるルータからIPを割り振ってもらうようにすればいいです
keicha_hrs

2018/12/11 07:29

質問者様の以前の質問で、「外部から遮断されたホストゲスト間をつなぐネットワーク」という要求を述べられています。その環境下でブリッジアダプターを推奨するのは好ましくないと考えます。
Takumi_s

2018/12/11 07:35

私が実現したい環境としては,私のマシンの中のみで完結するwindows-linux間のネットワークの構築をめざしております.ただ,必ずしも遮断されたネットワークである必要はなく,他のマシンからアクセスできるような構成でも問題はありませんので,アドレス空間に関しては同様のものでもいいと考えております.
guest

0

自己解決

結局のところファイヤーウォールが原因でした

投稿2018/12/16 13:40

Takumi_s

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問