4 実験結果 // 用意されたヘッダファイル #include < stdio.h> #include < fcntl.h> #include < netdb.h> #include < sys/types.h> #include < sys/socket.h> #include < sys/sta

Similar documents
通信プログラムの試作ーーー UDP を用いたじゃんけんゲームシステム ーーーー裘彬濱 南山大学情報理工学部 ソフトウェア工学科青山研究室

演算増幅器

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

BSDソケットによるIPv6プログラミングを紐解く

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

PowerPoint プレゼンテーション

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

ネットワークプログラミング

Microsoft Word - EGX100によるH663通信手引

DA100データアクイジションユニット通信インタフェースユーザーズマニュアル

エラー処理・分割コンパイル・コマンドライン引数

memo

CM-3G 周辺モジュール拡張技術文書 MS5607センサ(温度、気圧)

Microsoft PowerPoint - kougi2.ppt

Cプログラミング1(再) 第2回

Makefile, TCPソケットサーバ, コマンドライン引数

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

Microsoft Word - Cプログラミング演習(10)

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

TCP UDP TCP UDP send()sendto()sendmsg() recv()recvfrom()recvmsg() OS Passive Active TCP UDP IP TCP UDP MTAMail Transf

double float

Minimum C Minimum C Minimum C BNF T okenseq W hite Any D

PowerPoint Presentation

PowerPoint プレゼンテーション

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

1 1.1 C 2 1 double a[ ][ ]; 1 3x x3 ( ) malloc() malloc 2 #include <stdio.h> #include

:30 12:00 I. I VI II. III. IV. a d V. VI

r07.dvi

tuat1.dvi

ohp07.dvi

Microsoft PowerPoint - CproNt02.ppt [互換モード]

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

3 3.1 LAN ISDN (IP) 2 TCP/UDP IP IP IP IP (Ethernet) Ethernet LAN TCP/UDP LAN Ethernet LAN 2: Ethernet ATM, FDDI, LAN IP IP IP 3 IP 2 IP IP IP IP IP 3

プログラミングI第10回

情報ネットワーク演習 2006年10月5日

Condition DAQ condition condition 2 3 XML key value

GR-SAKURA-SAのサンプルソフト説明

:30 18:00 9:30 12:00 13:00 17:00

I. Backus-Naur BNF S + S S * S S x S +, *, x BNF S (parse tree) : * x + x x S * S x + S S S x x (1) * x x * x (2) * + x x x (3) + x * x + x x (4) * *

PowerPoint プレゼンテーション

ソケット API プロセス間通信の汎用 API プロセス : プログラムのひとつの単位 ex)./a.out とかやると 1 つのプロセスが立ち上がる ソケット API IPv4 IPv6 UNIX domain (UNIX 計算機内プロセス間通信 ) 本実験では IPv4 の TCP および UD

Microsoft Word - Cプログラミング演習(12)

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

file"a" file"b" fp = fopen("a", "r"); while(fgets(line, BUFSIZ, fp)) {... fclose(fp); fp = fopen("b", "r"); while(fgets(line, BUFSIZ, fp)) {... fclose

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

thesis.dvi

デバッグの工夫

プログラミング基礎

Java講座

Transcription:

実験 6 通信基礎実験 2 1 目的 ネットワークを通じてデータ転送を行うことを体験的に学ぶために 本実験ではT CP/IPプロトコルを使い ワークステーション間で通信を行うクライアントサーバモデルのプログラムを作成する 今回は文字データだけでなく 音声データも使う事により より実践的なプログラミングを行う 2 解説 前実験と同様なので省略する 3 実験 実験 1で作成したプログラムを利用して マイクから入力した音声信号をサーバへ送信するクライアントプログラムを作成せよ 作成したクライアントプログラムから送信された音声信号が サーバプログラムで正しく再生されること -1-

4 実験結果 // 用意されたヘッダファイル #include < stdio.h> #include < fcntl.h> #include < netdb.h> #include < sys/types.h> #include < sys/socket.h> #include < sys/stat.h> #include < sys/signal.h> #include < multimedia/libaudio.h> #include < multimedia/audio_device.h> #include < netinet/in.h> #include < netdb.h > // 通信基礎実験 1より #define SERV_UDP_PORT 7777 // ポート番号の設定 #define MAXLINE 1024 #define Error ( void) fprf #define Verb if ( VFlag) fprf // 用意されたヘッダファイル // 音声信号を標準出力するプログラムより unsigned char buf[ MAXLINE ]; char *Audio_dev = "/dev/audio"; Audio_fd; // オーディオデバイス用ファイル記述子 IntFlag = FALSE; // SIGINT 用フラグ VFlag = FALSE; // char *program; initialize() { struct stat st; if ( stat( Audio_dev, &st) < 0) { Error( stderr, "%s: cannot open audio device n", program ); exit( 1 ); if (!S_ISCHR( st.st_mode)) { Error( stderr, "%s: %s is not an audio device n", program, Audio_dev ); -2-

exit( 1 ); // オーディオデバイスを open する if (( Audio_fd = open( Audio_dev, O_RDONLY O_NDELAY)) < 0) { Error( stderr, "%s: audio device open error n", program ); exit( 1 ); rec_sig() { // IntFlag をセットする Verb( stderr, "%s: send SIGINT n", program ); if (!IntFlag && ( Audio_fd > = 0)) { IntFlag = TRUE; if ( audio_pause_record( Audio_fd ) == AUDIO_SUCCESS) return; Error( stderr, "%s: could not flush input buffer n", program ); // ˆC を 2 回押したので, 無条件に終了する Verb( stderr, "%s: end by double sig n", program ); exit( 1 ); main( argc, argv) argc; char *argv[]; { cnt; ofd; c; // 通信基礎実験 1より n, sockfd, servlen, dummylen; sockb; // socket() ホフ皃 ヘ bindb; // bind() ホフ皃 ヘ struct sockaddr_in serv_addr, cli_addr; struct hostent *host; char *hname; char *program; char sendline[ MAXLINE ], recvline[ MAXLINE + 1 ]; -3-

// 通信基礎実験 1より extern char *optarg; extern optind; program = argv[ 0 ]; る host = gethostbyname( argv[ 1 ]); // 引数で指定したサーバ情報を host に代入す initialize (); // audio d e v i c e の初期化 signal( SIGINT, rec_sig ); // servaddrにサーバアドレスを設定する bzero(( char *) &serv_addr, sizeof( serv_addr )); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr( inet_ntoa( host-> h_addr )); serv_addr.sin_port = htons( SERV_UDP_PORT ); sockb = socket( AF_INET,SOCK_DGRAM,0 );/* キ 荀 socket () */ if( sockb==-1){ Error; exit( 0 ); // cliaddrにローカルアドレスを設定する bzero(( char *) &cli_addr, sizeof( cli_addr )); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = htonl( INADDR_ANY ); cli_addr.sin_port = htons( 0 ); bindb = bind( sockb, ( struct sockaddr *)&cli_addr,sizeof( cli_addr )); if( bindb==-1){ Error; exit( 0 ); /* main loop */ -4-

// while ( 1) { 通信基礎実験 1より // バッファにデータを読み込む cnt = read( Audio_fd, ( char *) buf, sizeof ( buf )); if ( cnt == 0) break; if ( cnt < 0 ) { // エラーもしくは入力待ちの場合 if ( IntFlag) break; // ˆC が押されていたら終了する continue; // ˆC が押されていないとき if( sendto( sockb,buf,strlen( ( char *) buf ),0,( struct sockaddr *) &serv_addr,sizeof( serv_addr )) ==-1) // 音声信号を送る Error; // 通信基礎実験 1より close( sockfd ); exit( 0 ); // 後処理 ( void) close( ofd ); ( void) close( Audio_fd ); Verb( stderr, "%s: end of program n", program ); 音声信号を標準出力するプログラムより 以上のプログラムを使用 マイクに音声を入力すると サーバ側で再生される事を確認 -5-

5 考察 1 本実験では音声データの通信を行ったが 計算機で音声データを扱いプログラムを作成する場合 通信を行うプログラムを作成する場合 それぞれ注意すべき点を検討せよ 音声データがリアルタイムで送られてくる場合 文字データと比べものにならないほどのリソースを要する そのため 余分な処理を最小限に抑え 高速で処理出来るように配慮すべきだと思われる 2 通信プログラムの応用として どのようなアプリケーションが考えられるか 作ってみたいか検討せよ その実現に必要となる技術が有ればそれもあわせて検討せよ 1 音声の保存と入出力 音声で保存するメモ帳プログラム ボイスチャット 2 音声を文字として認識させる 入力された言葉を文字として取り入れるプログラム 入力された文字を翻訳し 音読させるプログラム( 翻訳機 ) 3 音声を音程として認識させる 入力された音を音階で保存するプログラム 入力された音楽の楽譜を作るプログラム 4 音声に何らかの変化を加える オーケストラなどの音楽から 周波数帯域を一部分だけ抜き出し 楽器ごとに音を分けて保存するプログラム 可聴周波数以上の音声の中間周波数を取り 可聴周波数まで下げる事により 擬似的に超音波を聴くプログラム 1について保存に関しては サウンドレコーダ ボイスチャットに関しては MSN メッセンジャー などで すでに実現されている ボイスチャットでは UDP では不便なので TCP を使っていると思われる 2にていて ドラゴンスピーチ ボイス一太郎 などで 実現されている しかし 精度はそれほど高くなく 実用的かどうかは微妙である 翻訳に対しても同じ事が言える 3について 鼻歌ミュージシャン などで実現されている 単音なら精度はかな -6-

り高い しかし雑音が入ってしまったり 和音が入ってしまうと認識されないのが現状 4について和音などの音階を取る事はとても難しいとされている 今 存在しているソフトウェアでは不可能だろう 自分が開発するとしたら 周波数帯域を区切るのではなく 波の形から一部の楽器を取り出す方法を提案してみたい バイオリンの響きとトランペットの響きを比べると バイオリンの方が振動が格段に多いはずである 可聴周波数云々は何故考えついたかというと 動物の声には超音波がつきものらしい 有名なのがイルカとコウモリ 彼らの声を人間の耳で確認するのは難しい ( 可聴周波数も使うので聞こえる声もある ) それを 擬似的にでも聞けたら面白いと思った 3 ネットワークセキュリティに関する問題点や利用技術について 自分でテーマを設定し考察せよ セキュリティ向上のためのプロトコルは多数存在する SSH SSL などには関わりもある どちらも暗号化と認証を謳っている 最近では Yahoo! JAPAN のメールサービスなどにも SSL が使われるようになったが 知っている人間はごく少数だろう 量子コンピュータが完成したら一般的な暗号化は無意味になるという話を聞くが そんな問題よりも 知らずに telnet を使い続けている人に目を向けた方が良いのではないだろうか どんな高度な技術もプログラムも エンドユーザが使用出来なければたいした意味は持たない Windows XP が出た当初はエンドユーザーコンピューティングという言葉をたびたび耳にした気がするが 最近は聞いた覚えがない 4 本実験を行って 難しかった点 興味を持った点 その他について感想を述べよ プログラム自体は切って張ってを繰り返しただけなので 大して難しい作業でもなく 大した問題もなく出来た 内容を理解したかどうかはいつも道理微妙である 一度感覚を理解してしまえば テンプレートなり アプリケーションなりで行うので 問題は無くなるのだろうが 最初の理解が難しい -7-