/* * IOB30RTAライブテストプログラム(com30rta.c) 2002.3 (V1.1) * * コンパイルと実行の手順 * A) Linux,Unix系の場合 * 1. cc com30rta.c * 2. ./a.out */ #if defined(__WINDOWS__) #include "stdafx.h" #include #endif #include #include #include #include #include #include #define IOB30RTAIPADDR ("61.120.61.164") /* IOB30RTAの接続ポート */ #define IOBPORT (20000) /* IOB30RTAの接続ポート */ #define MYHOSTPORT (30000) /* ホスト側の接続ポート */ #define RCVTOUTSEC (10) /* IOB30RTA接続タイムアウト秒 */ main() { int i, len; int sockid; struct sockaddr_in sndaddr; struct sockaddr_in rcvaddr; char sndbuff[BUFSIZ]; char rcvbuff[BUFSIZ]; char keybuff[BUFSIZ]; #if defined(__WINDOWS__) if( InitWinSock() < 0 ){ printf("Cannot use Winsock.\n"); exit(1); } #endif /* 1 ) ソケットの作成 */ if(( sockid = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ){ perror("socket"); exit(1); } /* 2 ) IOB30RTAへの送信アドレスの設定 */ memset( (void *)&sndaddr, 0, sizeof(sndaddr) ); sndaddr.sin_family = AF_INET; sndaddr.sin_port = htons ( IOBPORT ); #if defined(__WINDOWS__) sndaddr[0].sin_addr.S_un.S_addr = inet_addr( IOB30RTAIPADDR ); #else sndaddr.sin_addr.s_addr = inet_addr( IOB30RTAIPADDR ); #endif /* 3 ) ホスト側の受信アドレスの設定 */ memset( (void *)&rcvaddr, 0, sizeof(rcvaddr) ); rcvaddr.sin_family = AF_INET; rcvaddr.sin_addr.s_addr = INADDR_ANY; rcvaddr.sin_port = htons( MYHOSTPORT ); /* 4 ) 受信の準備 */ if( bind( sockid, (struct sockaddr *)&rcvaddr, sizeof(rcvaddr) ) < 0 ){ perror("bind"); exit(1); } printf("connect_to_IOB30RTA(%s)\n", IOB30RTAIPADDR ); printf("keyin --> 1111 ain\n" ); printf("keyin --> 1111 bout 1---\n" ); printf("keyin --> 1111 bin\n" ); printf("keyin --> 1111 bout 0---\n" ); printf("keyin --> 1111 bin\n\n" ); /* 5 ) 接点とリレーの状態、及びアナログ入力値の読み取り(永久ループ) */ while( 1 ){ printf("--> "); /* 6 ) キー入力 */ fgets( keybuff, sizeof(keybuff), stdin ); keybuff[strlen(keybuff)-1] = (char)0; /* 7 ) データの送信と応答受信 */ strcpy( sndbuff, keybuff ); len = iob30rta_com1( sockid, &sndaddr, &rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff), RCVTOUTSEC ); /* 8 ) 応答文の表示 */ rcvbuff[len] = (char)0; printf( "%s\n", rcvbuff ); } } iob30rta_com1( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen,timeoutsec ) int sockid; /* ソケットID */ struct sockaddr *sndaddr; /* 送信アドレス */ struct sockaddr *rcvaddr; /* 受信アドレス */ char sndbuff[]; /* 送信データバッファ */ int sndlen; /* 送信データ長 */ char rcvbuff[]; /* 受信データバッファ */ int rcvlen; /* 受信データバッファ長 */ int timeoutsec; /* 受信タイムアウト秒 */ { int len, fds, addrlen; fd_set fdset; struct timeval tm; /* 送信準備チェック */ fds = 1 + sockid; FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = (1); tm.tv_usec = (0); if( select( fds,(fd_set *)NULL,&fdset,(fd_set *)NULL,&tm ) <= 0 ){ return 0; } /* データ送信 */ addrlen = sizeof(struct sockaddr); (void)sendto( sockid,(void *)sndbuff,sndlen,0,sndaddr,addrlen ); /* 受信準備チェック */ FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = timeoutsec; tm.tv_usec = (0); if( select( fds,&fdset,(fd_set *)NULL,(fd_set *)NULL,&tm ) <= 0 ){ return 0; } /* データ受信 */ if(( len = recvfrom( sockid,(void *)rcvbuff,BUFSIZ,0,rcvaddr,&addrlen )) < 0 ){ perror("recvfrom"); exit(1); } /* 受信データ長 */ return len; } #if defined(__WINDOWS__) int InitWinSock() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return -1; } /* Confirm that the WinSock DLL supports 2.2. */ /* Note that if the DLL supports versions greater */ /* than 2.2 in addition to 2.2, it will still return */ /* 2.2 in wVersion since that is the version we */ /* requested. */ if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ WSACleanup( ); return -1; } return 0; } #endif