プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

Win32 APIでソケット通信する

この記事は2020年04月17日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. Win32 APIでソケット通信する
  3. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回はWin32 APIでソケット通信する方法についてです。

目次へ

2. Win32 APIでソケット通信する

Win32 APIでソケット通信する方法ですが、実装例のようになります。

実装例

#include "pch.h"
#include <iostream>
#include <WinSock2.h>
#include <ws2tcpip.h>

int main()
{
  // 接続先は環境に合わせて置き換えてください。
  // 接続先(IPアドレスまたはホスト名)
    std::string ipAddr = "127.0.0.1";
    //std::string ipAddr = "localhost";
  // ポート番号
    int portNo = <ポート番号>;

    // 初期化処理を行います。
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);

    // ソケットを生成します。
    SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);

    // 接続先情報を設定します。
    SOCKADDR_IN sockaddr;
    sockaddr.sin_family = PF_INET;
    sockaddr.sin_port = htons((USHORT)portNo);

    // 接続先を設定します。
    // まずはIPアドレスで設定します。
    InetPton(sockaddr.sin_family, ipAddr.c_str(), &sockaddr.sin_addr.S_un.S_addr);

    // 接続先がIPアドレスではない場合
    if (sockaddr.sin_addr.S_un.S_addr == 0xFFFFFFFF)
    {
        // 接続先をホスト名で設定します。
        ADDRINFOA hints;
        PADDRINFOA res = NULL;
        SecureZeroMemory(&hints, sizeof(hints));
        hints.ai_family = PF_INET;
        hints.ai_socktype = SOCK_STREAM;
        if (getaddrinfo(ipAddr.c_str(), NULL, &hints, &res) != 0)
        {
            // ホスト名で設定できない場合
            // 終了処理を行い、終了します。
            WSACleanup();
            return -1;
        }
        sockaddr.sin_addr.S_un = ((LPSOCKADDR_IN)(res->ai_addr))->sin_addr.S_un;
        freeaddrinfo(res);
    }

    // 接続します。
    int result = connect(sock, (LPSOCKADDR)&sockaddr, sizeof(sockaddr));

    // 接続できない場合
    if (result != 0)
    {
        // 終了処理を行い、終了します。
        WSACleanup();
        return -1;
    }

    // ここで送受信のsend関数とrecv関数で通信処理を行います。
    // (処理は省略します)

    // 切断します。
    closesocket(sock);

    // 終了処理を行います。
    WSACleanup();
    return 0;
}

目次へ

3. おわりに

業務でソケット通信する必要があり、その方法を調べてみました。

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ