1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WindowsとLinux間でソケット通信をする(UDP)

Last updated at Posted at 2023-05-13

・開発環境

Windows10
Visual Studio 2022

Linux
Virtual Box Ubuntu 22.04 LTS
VSCode

Linuxが仮想OSだとネットワークの初期状態がNATであるためブリッジ接続にしないといけない

Virtual Boxの場合は変更したい仮想OSを選択し、設定を開いてネットワークを選択
スクリーンショット 2023-07-10 094919.png

設定を開いてネットワークを選択。
NATの横にあるドロップダウンを押す。
スクリーンショット 2023-07-10 095813.png

ブリッジアダプターを選択。これでOK!
スクリーンショット 2023-07-10 100043.png

ソースコード(Windows側)

・インクルード

UdpClient.cpp
#include <stdio.h>
#include <iostream>
#include <string>
#include <WinSock2.h> 
#include <Windows.h>

#pragma comment(lib, "ws2_32.lib")

// inet_addr()関数で警告が出る場合は以下で警告を無効化する。
#pragma warning(disable:4996)

・変数&ソケット作成

UdpClient.cpp
    //ソケット
    int sock;
    sockaddr_in addr;
    WSAData wsaData;

    
    WSAStartup(MAKEWORD(2, 0), &wsaData);   
    sock = socket(AF_INET, SOCK_DGRAM, 0); 

    //ソケット作成
    sock = socket(AF_INET, SOCK_DGRAM, 0);

・Linuxに接続

UdpClient.cpp
    int port = 12345;
    std::cout << "ポート番号を入力" << std::endl;
    std::cin >> port;

    std::string addrNum;
    std::cout << "接続するIPアドレス" << std::endl;
    std::cin >> addrNum;

    std::string name;
    std::cout << "名前" << std::endl;
    std::cin >> name;

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.S_un.S_addr = inet_addr(addrNum.c_str());

・Linuxに文字を送信する

UdpClient.cpp
    //データ送信
    sendto(sock, name.c_str(), name.size(), 0, (struct sockaddr*)&addr, sizeof(addr));


    for (int i = 0; i < 100; i++) {
        std::cout << "送信する文字を入力してください" << std::endl;
        std::string data;
        std::cin >> data;
        data = name + ":" + data;
        //データ送信
        sendto(sock, data.c_str(), data.size(), 0, (struct sockaddr*)&addr, sizeof(addr));
        
    }

・ソケットの削除

UdpClient.cpp
    closesocket(sock);

    WSACleanup();

・ソースコード(Linux側)

・インクルード

UdpServer.cpp
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include<string>
#include<vector>
#include<iostream>

・変数作成&ポート番号入力

UdpServer.cpp
  int sock = socket(AF_INET, SOCK_DGRAM, 0);

  sock = socket(AF_INET, SOCK_DGRAM, 0); 

    int port=12345;
    std::cout<<"ポート番号を入力"<<std::endl;
    std::cin>>port;

  // アドレス等格納
  sockaddr_in addr;
  addr.sin_family = AF_INET;  //IPv4
  addr.sin_port = htons(port);   //通信ポート番号設定
  addr.sin_addr.s_addr = INADDR_ANY; 

・接続

UdpServer.cpp
     bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    
    char buf[100];

    memset(buf, 0, 100);
  

・送信された文字を表示

UdpServer.cpp
    recv(sock, buf, 100, 0);
    std::string name=buf;
    std::cout<<name + "がログイン"<<std::endl; 

    for (int i = 0; i < 100; i++) 
    {

        memset(buf, 0, 100);
        recv(sock, buf, 100, 0);
    
        std::cout<<buf<<std::endl;

    }
  
   close(sock); 

ちなみに今回はLinuxとWindowsの片方送信だったけど双方向をする場合はWindows側のファイアーウォール設定をしていないと、windowsからLinuxへのデータの送信が行えません。

コントロールパネルから Windowsファイアウォールを選択。
詳細設定をクリック。

winFW1.png

ファイルとプリンターの共有(エコー要求 - ICMPv4 受信)」をダブルクリック。
winFW2.png

「接続を許可する(L)」のラジオボタンにチェックし、「OK」を押下
winFW3.png

終わりに

今回は簡単なWindowsとLinuxの通信をしました。
Linuxが仮想OSだとネットワークの初期状態がNATであるためブリッジ接続にしないといけない
のでそれが分からずにかなり手間取ってしまいました。(・∀・;)

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?