0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C++からPythonへのソケット通信を実現する(環境構築とプロジェクト作成)

Last updated at Posted at 2024-07-30

C++からPythonにソケット通信をやってみました。環境構築とプロジェクト作成方法をステップバイステップでまとめました。Visual Studioのインストールから、ソケット通信を行うC++サーバーとPythonクライアントの実装までをカバーします。

環境

  • Windows11
  • Visual Studio 2022 Comunity
  • Python 3.8.10

:notebook_with_decorative_cover: 環境構築

ステップ 1: Visual Studio のインストール

1.1 Visual Studio のダウンロードとインストール

  1. Visual Studioの公式ダウンロードページにアクセスします。
  2. "Visual Studio Community" エディションを選択し、ダウンロードを開始します。
  3. ダウンロードしたインストーラーを実行し、インストールを開始します。

1.2 ワークロードの選択

  1. インストール中に、**「C++によるデスクトップ開発」**のワークロードを選択します。
  2. その他の必要なコンポーネントを選択し、インストールを完了します。

ステップ 2: Python のインストール

2.1 Python のダウンロードとインストール

  1. 今回はPython 3.8をisntallしました。以下のリンクからWindows installer (64-bit)をダウンロードします。

  1. 一番下のAdd Python.exe to PATH にチェックをつけてInstall Nowを押す。あとは言われるがままにYESを押せば大丈夫です。

image.png

:writing_hand_tone1: 実装

ステップ 3: Visual Studio で C++ プロジェクトを作成

3.1 新しいプロジェクトの作成

  1. Visual Studio を起動し、「ファイル」メニューから「新規作成」 > **「プロジェクト」**を選択します。
  2. **「空のプロジェクト」テンプレートを選択し、プロジェクト名と保存場所を指定して「作成」**をクリックします。

3.2 C++ ソースファイルの追加

  1. ソリューションエクスプローラーでプロジェクト名を右クリックし、「追加」 > **「新しい項目」**を選択します。
  2. **「C++ファイル (.cpp)」を選択し、ファイル名をserver.cppとして「追加」**をクリックします。

3.3 C++ ソースコードの記述

  1. server.cppファイルに以下のコードを記述します。
#include <winsock2.h>
#include <iostream>

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

void sendValues(int value1, int value2, int value3, int value4) {
    WSADATA wsa;
    SOCKET server, new_socket;
    struct sockaddr_in server_addr, client_addr;
    int c;

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        std::cerr << "WSAStartup failed. Error Code: " << WSAGetLastError() << std::endl;
        return;
    }

    if ((server = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
        std::cerr << "Could not create socket. Error Code: " << WSAGetLastError() << std::endl;
        return;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8888);

    if (bind(server, (struct sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) {
        std::cerr << "Bind failed. Error Code: " << WSAGetLastError() << std::endl;
        return;
    }

    listen(server, 3);

    c = sizeof(struct sockaddr_in);
    new_socket = accept(server, (struct sockaddr*)&client_addr, &c);
    if (new_socket == INVALID_SOCKET) {
        std::cerr << "Accept failed. Error Code: " << WSAGetLastError() << std::endl;
        return;
    }

    int values[4] = { value1, value2, value3, value4 };
    send(new_socket, (char*)values, sizeof(values), 0);

    closesocket(new_socket);
    closesocket(server);
    WSACleanup();
}

int main() {
    sendValues(10, 20, 30, 40);
    return 0;
}

3.4 プロジェクトのビルド

  1. **「ビルド」メニューから「ソリューションのビルド」**を選択します。

ステップ 4: Python クライアントの作成

4.1 Python ファイルの作成

  1. 任意のテキストエディタを使用して、client.pyファイルを作成し、以下のコードを記述します。
import socket
import struct

def main():
    host = '127.0.0.1'
    port = 8888

    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((host, port))

    data = client_socket.recv(16)
    values = struct.unpack('iiii', data)
    print(f"Received values: {values}")

    client_socket.close()

if __name__ == "__main__":
    main()

:bicyclist: 実行

ステップ 5: C++ サーバーの実行

5.1 Developer Command Prompt for Visual Studio の使用

  1. スタートメニューを開き、**「Developer Command Prompt for Visual Studio」**を検索して起動します。
  2. コマンドプロンプトで、server.cppファイルがあるディレクトリに移動します。例えば:
cd C:\Users\YU\source\repos\Project1\Project1
  1. 以下のコマンドを実行して、C++コードをコンパイルします。
cl server.cpp
  1. コンパイルが成功したら、以下のコマンドを実行してサーバーを起動します。
server.exe

ステップ 6: Python クライアントの実行

  1. 新しいコマンドプロンプトまたはターミナルを開き、client.pyファイルがあるディレクトリに移動します。
  2. 以下のコマンドを実行して、Pythonクライアントを起動します。
python client.py

これで、C++サーバーとPythonクライアントの間でソケット通信が行われ、C++サーバーから送信された4つの整数値がPythonクライアントで受信されるはずです。


以上で、C++とPythonを使用してソケット通信を実現するための環境構築とプロジェクト作成の手順が完了です。


追記

何回もソケット通信を行う場合は、毎回ソケットを初期化するのは効率が悪いので、ソケットの初期化、値の送信、ソケット閉鎖は関数を分けたほうかがいいかもしれないです。
参考👇

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?