ソケット通信のプログラム(PC側)


前回のソケット通信の続きで、今回はPC側のプログラムです。
PC側のOSはWindowsで、クライアントとして動作させます。

今回はVisualStudioでwin32コンソールアプリケーションで作成しました。

21行目のIPアドレスは接続先サーバーのマイコンのアドレスを設定してください。
37行目のポート番号は前回の記事で書いたプログラムで設定したポート番号を設定してください。

ソースは以下の通りです。

#include "stdafx.h"
#include <stdio.h>

#include <winsock2.h>

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

int _tmain(int argc, _TCHAR* argv[])
{
	
	SOCKET soc;    //ソケット

	//接続するサーバの情報
	struct sockaddr_in dest;

	//接続先IPアドレス
	char destination[] = "127.0.0.1";

	char buffer[1024];

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

	//ソケット通信の準備
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);

	//接続先(サーバ)のアドレス情報を設定
	memset(&dest, 0, sizeof(dest));

	//ポート番号はサーバプログラムと共通
	dest.sin_port = htons(12345);
	dest.sin_family = AF_INET;
	dest.sin_addr.s_addr = inet_addr(destination);

	//ソケットの生成
	soc = socket(AF_INET, SOCK_STREAM, 0);

	//サーバへの接続
	if(connect(soc, (struct sockaddr *) &dest, sizeof(dest))){
		printf("%sに接続できませんでした\n", destination);
		return -1;
	}

	printf("%sに接続しました\n", destination);

	//送信データを設定
	td_send.prm_pc_to_soc[0] = (float)11;
	td_send.prm_pc_to_soc[1] = (float)12;
	td_send.prm_pc_to_soc[2] = (float)13;
	td_send.prm_pc_to_soc[3] = (float)20;

	//サーバにデータを送信
	send(soc, (char *)&td_send, sizeof(td_send), 0);

	printf("データを送信しました。\n");

	//サーバからデータを受信
	recv(soc, (char *)&td_recv, sizeof(td_recv), 0);
		
	//受信データを表示
	printf("recv0 = %f\n", td_recv.prm_soc_to_pc[0]);
	printf("recv1 = %f\n", td_recv.prm_soc_to_pc[1]);
	printf("recv2 = %f\n", td_recv.prm_soc_to_pc[2]);
	printf("recv3 = %f\n", td_recv.prm_soc_to_pc[3]);
	printf("servo pwm1 = %f\n", td_recv.prm_soc_to_pc[4]);

	//受信データ確認のため処理を止める
	scanf("%s", buffer);

	// Windows でのソケットの終了
	closesocket(soc);
	WSACleanup();
	
	return 0;
}

これらを実装後に、まずマイコン側のサーバープログラムを実行し、接続待ち状態にしてからこちらのクライアントプログラムを実行すると通信ができます。

前回、今回のプログラムを各ハードウェア上でマルチスレッドで動作させて、別のスレッドから送受信するデータを読み書きしてやると、PCとRaspberry Pi、DE0などのマイコンボードをリアルタイム通信させ、連携して動作させることができるようになると思います。

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です