LoginSignup
3
4

More than 5 years have passed since last update.

Raspberry Piでソケット通信

Posted at

Raspberry Piでソケット通信する

 Raspberry Piでソケット通信をするためのプログラムです。サーバ側のプログラムです。

環境

ハードウェア:Raspberry Pi 2
OS:Debian GNU/Linux 8
言語:C

ソースコード


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


//転送用構造体
typedef struct {
    float prm_pc_to_soc[20];        //PC→SoCへの転送パラメータ
    float prm_soc_to_pc[20];        //SoC→PChへの転送パラメータ
} Transfer_data;


int
main()
{
    int sock0;
    struct sockaddr_in addr;
    struct sockaddr_in client;
    int len;
    int sock;
    int yes = 1;


    //パラメータ転送構造体
    Transfer_data td_recv;
    Transfer_data td_send;

    //転送テスト用データ
    float send0 = 30;
    float send1 = 444;

    //ソケット作成
    sock0 = socket(AF_INET, SOCK_STREAM, 0);

    //ソケット作成エラーチェック
    if(sock0 < 0) {
        perror("socket");
        return -1;
    }

    //接続先情報設定
    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr = INADDR_ANY;

    //ソケットのオプション設定
    setsockopt(sock0, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes,  sizeof(yes));

    //アドレスとソケットディスクリプタを関連付け
    if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
        perror("bind");
        return -1;
    }

    //接続待ちに設定(acceptにて接続要求を受ける)
    if(listen(sock0, 5) != 0) {
        perror("listen");
        return -1;
    }


    //接続要求待ちループ
    while (1) {
        len = sizeof(client);
        sock = accept(sock0, (struct sockaddr *)&client, &len);

        //接続エラー判定
        if (sock < 0) {
            //エラー時はループを抜けて処理を終了
            perror("accept");
            break;
        }

        //受信用バッファ用意
        memset(td_recv, 0, sizeof(td_recv));

        //データ受信
        recv(sock, (void *)&td_recv, sizeof(td_recv), 0);

        //受信したデータを表示
        printf("recv0 = %f\n", td_recv.prm_pc_to_soc[0]);
        printf("recv1 = %f\n", td_recv.prm_pc_to_soc[1]);
        printf("recv2 = %f\n", td_recv.prm_pc_to_soc[2]);

        //送信データをセット
        memcpy(&td_send.prm_soc_to_pc[0], &send0, sizeof(float));
        memcpy(&td_send.prm_soc_to_pc[1], &send1, sizeof(float));

        //データ送信送信
        send(sock, (char *)&td_send, sizeof(td_send), 0);

    }

    //ソケットクローズ
    close(sock0);

    printf( "Close socket...\n" );

    return 0;
}
3
4
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
3
4