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

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の公式ダウンロードページ](https://visualstudio.microsoft.com/ja/downloads/)にアクセスします。
2. "Visual Studio Community" エディションを選択し、ダウンロードを開始します。
3. ダウンロードしたインストーラーを実行し、インストールを開始します。

### 1.2 ワークロードの選択

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

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

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

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

https://www.python.org/downloads/release/python-3810/

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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328398/96dcc631-7a30-d4bb-b62e-9c67c1c92b38.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`ファイルに以下のコードを記述します。

```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`ファイルを作成し、以下のコードを記述します。

```python
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`ファイルがあるディレクトリに移動します。例えば：

```power
cd C:\Users\YU\source\repos\Project1\Project1
```

3. 以下のコマンドを実行して、C++コードをコンパイルします。

```sh
cl server.cpp
```

4. コンパイルが成功したら、以下のコマンドを実行してサーバーを起動します。

```sh
server.exe
```

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

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

```sh
python client.py
```

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

---

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


---

### 追記

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

https://chatgpt.com/share/ad147488-f65d-4d60-96bc-b07f45c1b016