#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;
}