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

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

ただいまの
回答率

89.13%

windows-linux間の通信

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,349

Takumi_s

score 13

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 でビルドしています.

#include "stdafx.h"

#include <stdio.h>
#include <winsock.h>

#define PORT_NO_SERVER (12345)
#define IP_ADDRESS_SERVER "192.168.55.254"

int main(void)
{
    WSADATA wsaData;
    struct sockaddr_in server;
    SOCKET sfd = -1;
    char buf[32] = { 0 };
    int rc = 0;

    WSAStartup(MAKEWORD(2, 0), &wsaData);

    sfd = socket(AF_INET, SOCK_STREAM, 0);

    server.sin_family = AF_INET;
    server.sin_port = htons(PORT_NO_SERVER);
    server.sin_addr.S_un.S_addr = inet_addr(IP_ADDRESS_SERVER);

    rc = connect(sfd, (struct sockaddr *)&server, sizeof(server));
    if (rc < 0) {
        printf("connect() failed(%d)\n", rc);
        exit(EXIT_FAILURE);
    }
    while (1) {
        memset(buf, 0, sizeof(buf));
        int rs = recv(sfd, buf, sizeof(buf), 0);

        printf("recv %d byte, %s\n", rs, buf);
    }

    WSACleanup();

    return 0;
}


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

サーバ側

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

#define MAX_CLIENTS (1)
#define MSGBUF_SIZE (1024)

int main(void)
{
    int sfd = -1;
    struct sockaddr_in client;
    int socklen = sizeof(client);
    int ac_sfd = -1;
    int rc = 0;

    struct sockaddr_in addr = {
        .sin_family = AF_INET,
        .sin_port = htons(12345),
        .sin_addr = {
            .s_addr = INADDR_ANY,
        },
    };

    /* ソケットの作成 */
    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd < 0) {
        perror("socket");
        goto error_end;
    }

    rc = bind(sfd, (struct sockaddr *)&addr, sizeof(addr));
    if (rc < 0) {
        perror("bind");
        goto close_sfd_end;
    }

    rc = listen(sfd, MAX_CLIENTS);
    if (rc < 0) {
        perror("listen");
        goto close_sfd_end;
    }

    /* 要求受付 */
    ac_sfd = accept(sfd, (struct sockaddr *)&client, &socklen);
    if (ac_sfd < 0) {
        perror("accept");
        goto close_sfd_end;
    }

    while (1) {
        /* メッセージ送信 */
        char msgbuf[MSGBUF_SIZE] = "HELLO WORLD!";
        ssize_t ws = write(ac_sfd, msgbuf, strlen(msgbuf));
        if (ws < 0) {
            perror("write");
            goto close_all_end;
        }

        sleep(1);
    }

 close_all_end:
    close(ac_sfd);
 close_sfd_end:
    close(sfd);
 error_end:

    return 0;
}
  • (VSCode上でいくつかのヘッダファイルを開けないと言われているが関係ある???)
    ⇒stdio.hも該当しているのですが,以前IDEを用いないでcのプログラムをコンパイルした際に,特に併せてコンパイルしなくても機能を利用できたため関係ないと考えています.
  • windows -> centos の ping は通っている
  • centos -> windows の ping は通らない
    →ネットワーク構成の問題?
    以前質問させていただいた,ネットワーク構成についての疑問

ip
ip設定

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Takumi_s

    2018/12/11 17:26

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

    キャンセル

  • keicha_hrs

    2018/12/11 18:46 編集

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

    キャンセル

  • Takumi_s

    2018/12/13 09:45

    ありがとうございました

    キャンセル

回答 3

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/11 16:23

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

    キャンセル

  • 2018/12/11 16:29

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

    キャンセル

  • 2018/12/11 16:35

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/13 09:44

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

    キャンセル

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる