Yuki Nakata's Blog

One color just reflects another

カテゴリ: Raspberry PI

Raspberry pi3にretropiをインストールしてみました。

プレイステーションもN64も全く遅延がありません。快適に遊べます。

新たにmicroSDカードを購入。一枚のmicroSDカードを使い回すのではなくOS毎にSDカードを持っておくと便利です。ラズベリーパイに入れ替えるだけですからね。

retropiを使うとラズベリーパイをゲーム用マシンにすることができます。 ファミコン、スーパーファミコン、アーケード、64などの主要なエミュレーターが含まれています。

RetroPie から RetroPi 4.0.2をダウンロードします。現在最新は4.0.2です。
解凍してimgファイルを取り出します。

microSDをSDFormatter を使ってフォーマットします。
sdformatter
オプション設定から上書きフォーマット 論理調整 ONでフォーマットします。

取り出したimgをWin32DiskImagerを使って書き込みます。
win32diskimager
出来たらmicroSDカードを取り出しラズベリーパイに装着します。

ゲームコントローラーを付けてラズパイの電源を入れます。
cf42f25c-3cee-11e5-8f91-c1fc1c57175c
ゲームコントローラーのボタンを割り当てていきます。

Logicool F310を使っています。下の画像と同じように設定。
7f353148-42c0-11e6-9023-dbaf074bc933

割り当てるボタンがなかったり、スキップしたい場合にはAボタン長押しです。

c6bbdb3a-3734-11e6-998f-8cc714a320ce
EmulationStationが現れます。retropiのエミュレーターの統括プログラムをEmulationStationといいます。

ここで1時間ハマりました。何をしていいかわからない。ゲームが遊べないので困りました。Romをフォルダに入れるとNESやSNES, MAMEの選択肢が出てきます。

最初にネットワークにつなぎましょう。有線LANでつないでいますが、無線の場合にはメニューからConfigure Wifiで無線設定をします。
7ed23ec0-3cf5-11e5-9944-a8f7870cc6c0
無線の場合
92b08b8c-3735-11e6-8f20-5d1550af0882

ネットに接続されたらIPアドレスを確認します。SHOW IP

この場合は192.168.0.19です。これを覚えておきます。

RETROPIE SETUPからBasic Installをしました。
エミュレーターのインストールが始まります。大分時間がかかります。


RETROPI SETUPからエミュレーター単体で追加インストールすることもできます。

あとはラズパイにロムを転送します。
指定のディレクトリにロムを放り込めばいいのですが、Filezillaを使うのが一番簡単だと思います。
retropiがネット接続できていれば、filezillaからファイル転送することができます。
Filezilla clientをダウンロードして実行します。
filezilla
ホストにIPアドレス 192.168.0.19 
ユーザー名 pi
パスワード raspberry
ポート 22 で接続できます。

ファミコンの場合には/home/pi/RetroPie/roms/nes
スーファミ /home/pi/RetroPie/roms/snes
N64  /home/pi/RetroPie/roms/n64
アーケード /home/pi/RetroPie/roms/mame-mame4all
アーケードゲームの場合注意が必要です。
ロムのバージョンが0.37b5でなければ動作しません。
真っ黒の画面でクラッシュする場合にはロムセットが間違っている可能性があります。
zipでmame-mame4allのディレクトリに入れます。
RetroPie Mame

PS1 /home/pi/RetroPie/roms/psx
cueとbinをpsxディレクトリに入れます。
bios SCPH1001.BIN を/home/pi/RetroPie/BIOS
プレイステーションはcueファイルがないと動作しません。
Playstation Cue FIle cueファイルがここで手に入るようです。
RetroPie PlayStation

このように放り込むロムのディレクトリが指定されています。
日本語のファイル名は文字化けします。

ロムを放り込むと初期の画面が変わります。 

メニューが変わり、ゲームが選べるようになった。 

音はHDMIから出力されるようになっています。
イヤホンに変更する場合にはemulationstationを一旦終了するとコマンドが打てるようになります。
$ amixer cset numid=3 1     イヤホンに音を出力させる

$amixer cset numid=3 2       HDMIに音を出力させる

音量設定 パーセンテージで指定します。 50%~100%で指定します。
$ amixer cset numid=1 70%
70%ぐらいがおすすめです。 50%以下だと何も聞こえなくなります。 

raspberry pi3でSDカードの速度を測ってみました。

_SL1500_
使っているのはTrascend TS32GUSDU1PE
32GB Class10 UHS-I対応 400×
価格は1000円程度。

ddを使えば簡単に性能テストすることができます。
まずは書き込みから3回。
$dd if=/dev/zero of=test bs=1048576 count=200
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 9.51548 秒、 22.0 MB/秒
$ dd if=/dev/zero of=test bs=1048576 count=200
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 10.7134 秒、 19.6 MB/秒
$ dd if=/dev/zero of=test bs=1048576 count=200
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 10.0956 秒、 20.8 MB/秒
約20MB/秒出ています。
 
次は読み込み3回。
$ dd if=test of=/dev/null bs=1048576
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 0.283352 秒、 740 MB/秒
$ dd if=test of=/dev/null bs=1048576
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 0.284043 秒、 738 MB/秒
$ dd if=test of=/dev/null bs=1048576
200+0 レコード入力
200+0 レコード出力
209715200 バイト (210 MB) コピーされました、 0.297618 秒、 705 MB/秒

やけに早くねえか。ま、いっか。

結果は上出来だと思います。
価格の高いものを買ってもラズベリーパイの起動が早くなることはありません。ほとんど変わらないようです。

Raspberry PI SDカード 
ここに対応SDカードと性能パフォーマンスが載っています。

書き込み20MB/s 出て入れば最高クラスです。

次回も同じTrascendを購入することにしています。

 

raspberry pi3でmameを動かします。ちゃんとアーケードゲームが遊べてしまいます。

Better AdvanceMAME debs with Sound! から advancemame-raspberrypi_1-1_armhf.debをダウンロードします。

サウンドも出るようになりました。

$sudo dpkg -i advancemame-raspberrypi_1-1_armhf.deb

起動は /usr/local/bin/advmameです。

ロムファイルをデフォルトの/home/pi/.advance/rom に放り込みます。

$advmame  gamename
で起動します。gamenameは.zipなしで。

ゲームパッドも接続するだけ。後は何もしません。

設定ファイルは/home/pi/.advance/advmame.rc ですが、何も変更なし。

知っていると思いますが、デフォルトで数字の5でコイン投入(Coin)、1でゲームスタート(Player Start)。

最後にMAMEを自動起動させてみましょう。キーボードとマウスなしでもいけます。

起動時のOKはゲームパッドの左、右の入力でOKと同じことになります。

ゲーム中 Tab -> input (general) -> other controls
ここから Player StartとCoinボタンをカスタマイズ。好きなボタンに設定。

スクリプトを作成。
$sudo /usr/local/bin/advmame.sh

#!/bin/bash

BASEDIR=/usr/local/bin

# Wait for the PS3 Game pad to be available
while [ ! -e /dev/input/js0 ]; do sleep 2; done

# The DISPLAY=:0 bit is important for the GUI to work
DISPLAY=:0 $BASEDIR/advmame gamename

#gamenameを指定しなければなりません。でスクリプトを実行可能にする。
$sudo chmod +x /usr/local/bin/advmame.sh

自動起動に登録
$vi /home/pi/.config/lxsession/LXDE-pi/autostart

最後の行に追加
@/usr/local/bin/advmame.sh

これでラズベリーパイが起動すると自動的にadvmameが立ち上がります。 

 

ラズベリーパイをスーパーファミコンにしよう


ラズベリーパイ3を持っています。ラズベリーパイをスーパーファミコンにします。

この動画に刺激を受けてやってみたくなりました。

1.pisnesをダウンロード
 pisnes ここからpisnesをダウンロードします。

 解凍するだけです。ラズベリーパイ用にコンパイル済みです。
 snes9xと snes9x.guiが実行ファイルです。
 #snes9x romfile.sfc
 #snes9x.gui こちらはGUIでロムファイルを選択できます。

2. ソフトを用意します。
 自分の持っているソフトを用意してpisnes/romディレクトリの中にください。
 拡張子はsfcとなります。

3. ゲームパッドを接続します。
 ゲームパッドをUSBに接続します。
 logicoolのF310 定番ゲームパッドを使用しています。
  f310-gaming-gamepad-images
 つなぐだけです。pisnesでも自動認識してくれます。
 エミュに良くあるボタンの割り当てが不要です。とにかく接続するだけでOK。素晴らしいです。

4. ラズベリーパイが起動時に自動起動させます。
 せっかくなので自動起動させてみましょう。キーボードやマウスもいらなくなります。

/home/pi/Game/pisnes このディレクトリにpisnesを置いています。

 シェルスクリプトを作ります。
 直接 snes9x.guiを実行するのではなく、間接的にシェルスクリプトから実行させます。
 面倒くさいのですが、これはやっておくべきです。 

#sudo vi /usr/local/bin/snes-run-gui

snes-run-guiの内容
#!/bin/bash

BASEDIR=/home/pi/Game/pisnes

# Wait for the PS3 Game pad to be available
while [ ! -e /dev/input/js0 ]; do sleep 2; done

# The DISPLAY=:0 bit is important for the GUI to work
DISPLAY=:0 $BASEDIR/snes9x.gui
ここまで

スクリプトを実行できるようにします。
#sudo chmod +x /usr/local/bin/snes-run-gui

自動起動に登録
/home/pi/.config/lxsession/LXDE-pi/autostart の最後の行に1行追加します。
もしかしたら古いラズベリーパイの場合、/home/pi/.config/lxsession/LXDE/autostartかもしれません。

@/usr/local/bin/snes-run-gui

これで起動時にpisnesが立ち上がります。やってみましょう。

最後になぜシェルスクリプトから実行する理由は、直接snes9x.guiを実行するとキーボードを認識しなくなり、復帰できなくなるからです。
スーパーファミコンはできるのですが、元に戻せなくなったからです。
リモートからログインして復帰できるようになりましたが、、、汗

参考サイト
Building a SNES emulator with a Raspberry Pi and a PS3 gamepad
 

ラズベリーパイ3を買いました。これでトータル3つ目です。

全体的には早くなっていますが、ブラウザを開くとどうしても遅いです。

デスクトップPCとして使うにはかなりの忍耐が必要です。

設定したので忘れないうちに書きなぐって置きます。

OSのインストールはEnglishでインストールした方が良いでしょう。

日本語でインストールするといきなり文字化けします。あとからでも日本語に設定変更できます。

・まず初めにするのがネットワーク接続。
有線でネットワーク接続しました。

・IPアドレス固定
IPアドレスを固定しておくと後々便利です。

Iaアドレス 192.168.0.102で設定しました。PCやスマホとかと、かぶらなければOK

有線なのでネットワークアダプタがこの場合eth0となります。無線の場合にはwlan0となります。

sudo vi /etc/dhcpcd.conf  の内容
interface eth0
static ip_address=192.168.0.102/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8

これでラズベリーパイが起動すると自動的にネットにつながります。

・日本語表記
sudo apt-get install jfbterm
参考サイト  RYUS blog
 
・midoriのインストール 軽量ブラウザとしては一番ましでしょう。
#sudo apt-get install midori

・chromeのインストール
#sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5B393194

#sudo vi /etc/apt/sources.list
次の一行を追加
deb http://ppa.launchpad.net/canonical-chromium-builds/stage/ubuntu vivid main

#sudo apt-get update
#sudo apt-get install chromium-browser chromium-browser-l10n
これでchromiumが使えます。youtubeも視聴できます。

・ダウンロードゲッターのインストール
 chromiumで動画ゲッター のサイトから拡張機能をインストールをクリック。


・日本語フォントのインストール
このままではchromeの文字が汚いです。綺麗なフォントをインストールしましょう。
#sudo apt-get install fonts-vlgothic

#sudo apt-get install ttf-kochi-gothic ttf-kochi-mincho fonts-takao fonts-vlgothic fonts-ipafont xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname 

インストールするだけでアプリのフォントが綺麗になります。勝手に最適なフォントを選んでくれるようです。

・音サウンド ヘッドホン/スピーカーに切り替える。
デフォルトで音はHDMI出力つまりディスプレイに流れるようになっています。

これをヘッドホン・スピーカー出力へと切り替えましょう。amixerデフォルトでインストール済み
#amixer cset numid=3 1
イヤホンやスピーカーをラズパイにつなげば、音が出ます。

元に戻すには最後を2に設定しなおします。
#amixer cset numid=3 2 
 
・動画を見る
動画プレイヤーはmplayerがおすすめです。軽い。
smplayerはmplayerのフロントエンド、重い。
一応vlcプレイヤーもインストールできますが、重い。
#sudo apt-get install mplayer
#sudo apt-get install smplayer
#sudo apt-get install vlc

・外付けHDD
exfatでフォーマット済みのHDDをラズベリーパイに接続させます。

#sudo fdisk -l
Device      Start        End    Sectors  Size Type
/dev/sda1      40     409639     409600  200M EFI System
/dev/sda2  409640 5860270983 5859861344  2.7T Microsoft basic data
この場合/dev/sda2が外付けHDDとして認識されています。環境によって異なります。
# sudo apt-get install exfat-fuse exfat-utils
再起動すると/media/pi/ 以下に自動マウントされます。


・processing 3.01
なんとprocessingがラズパイで動くようになりました。解凍して実効するだけ
#wget https://github.com/processing/processing/releases/download/processing-0247-3.0.1/processing-3.0.1-linux-armv6hf.tgz
#tar xvzf processing-3.0.1-linux-armv6hf.tgz
#cd processing-3.0.1/
# ./processing


・adobe flash player プラグインインストール
#wget http://mirror.archlinuxarm.org/armv7h/alarm/chromium-pepper-flash-12.0.0.77-1-armv7h.pkg.tar.xz
#tar Jxvf PepperFlash-12.0.0.77-1-armv7h.pkg.tar.xz
#sudo cp libpepflashplayer.so /usr/lib/chromium-browser/plugins/
#sudo vi /etc/chromium-browser/default

以下の記述を追加。
CHROMIUM_FLAGS="--ppapi-flash-path=/usr/lib/chromium-browser/plugins/libpepflashplayer.so --ppapi-flash-version=12.0.0.77 -password-store=detect -user-data-dir"

chromiumのアドレスバーでchrome://plugins にアクセス
adobe flash playerが有効になっていることを確認。
 
参考サイト 『イナムラ総研(仮)の開発レポート的な何か。』
 

・firefox Javajreインストール
firefoxとfirefoxのプラグインをインストールしました。
#sudo apt-get install iceweasel iceweasel-l10n-ja
#sudo apt-get install icedtea-plugin
chromeでもjavaアプレットが動作するようになります。
OpenProcessing も動作します。
 
・マンガビューワ
#sudo apt-get install comix
見開き表示DにしてフルスクーリンF、横幅に合わせるW。
 
新しいラズベリーパイが登場するとどうしても買ってしまいます。次こそはスルーします。
 

ラズベリーパイでechoサーバーを作ろう の続きです。

引き続きネットワークプログラミングです。ファイルを転送するプログラムです。

普通はftpとかfilezillaを使ってファイルを転送するわけですが、シンプルなものであればプログラミングで作れます。

前回は文字列を送受信するプログラムを作りました。

文字列をファイルに置き換えるとできます。

結局やっていることはソケットを使ってread, writeしているだけです。

ネットワークにつないでしまえば、後はどうにかなります。

サーバー側です。cpserver.c

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


#define PORT 9877

int main(){
  
  int i = 0;
  int srcSocket;
  int dstSocket;
  
  struct sockaddr_in srcAddr;
  struct sockaddr_in dstAddr;
  int dstAddrSize = sizeof(dstAddr);
  // 各種パラメータ
  int status;
  int numrcv;
  char buf[1024];
  int len = 0;
  int size = 0;
  char filename[64];
  int fp;
  unsigned long filesize = 0;
  unsigned long totalrcv = 0;

  // sockaddr_in 構造体のセット
  bzero((char *)&srcAddr, sizeof(srcAddr));
  srcAddr.sin_port = htons(PORT);
  srcAddr.sin_family = AF_INET;
  srcAddr.sin_addr.s_addr = INADDR_ANY;
    
  srcSocket = socket(AF_INET, SOCK_STREAM, 0);
  bind(srcSocket, (struct sockaddr *)&srcAddr, sizeof(srcAddr));
  listen(srcSocket, 1);
  // 接続の受付け
  printf("接続を待っています\nクライアントプログラムを動かして下さい\n");
  dstSocket = accept(srcSocket, (struct sockaddr *)&dstAddr, &dstAddrSize);
  printf("%s から接続を受けました\n",inet_ntoa(dstAddr.sin_addr));

  while(1) {
memset(filename, 0, sizeof(filename));
len = read(dstSocket, buf, 2);
if(len < 0) {
 printf("エラー: ファイル名のエラーです。\n");
 return -1;
}

size = buf[0] << 8;      
    size |= buf[1];
len = read(dstSocket, buf, 4);
if(len < 0) {
 printf("エラー: ファイルサイズのエラーです。\n");
 return -1;
}
filesize = buf[0] << 24;
filesize |= buf[1] << 16;
filesize |= buf[2] << 8;
filesize |= buf[3];
printf("filesize = %ld byte\n", filesize);

len = read(dstSocket, filename, size);
if (len < 0) {
 printf("エラー: ファイル名を取得できませんでした。");
 return -1;
} else if (!strcmp(filename, "quit")) {
 printf("プログラムを終了します。\n\n");
 return 0;
}
printf("filename = %s\n", filename);

/* 書き込みファイルを開く */
if ((fp = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) {
 printf("エラー ファイルを作成できません");
 return -1;
}

totalrcv = 0;
while(1){
 //パケットの受信
 numrcv = read(dstSocket, buf, 1024);
 //printf("%d %d\n", i, numrcv);
 if(numrcv <= 0 ){
break;
 }

 write(fp, buf, numrcv);
 totalrcv += numrcv;
 if(totalrcv >= filesize) {
printf("%s 転送完了\n\n", filename);
break;
 }
}
close(fp);
  }

  close(srcSocket);
  return(0);
}


クライアント側です。 cpclient.c
 
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PORT 9877 //サーバープログラムとポート番号を合わせてください
char buf[1024];
char filesize[4];

int main(){
  char destination[32] = "192.168.0.10";//サーバーのIPアドレスを入れて下さい。
  //ソケット,sockaddr_in 構造体
  int dstSocket;
  struct sockaddr_in dstAddr;
  struct hostent *hp;
  int    numrcv;
  char filename[100];
  int len = 0;
  int fp;
  int size;
  struct stat statBuf;

  //sockaddr_in 構造体のセット
  bzero((char *)&dstAddr, sizeof(dstAddr));
  dstAddr.sin_family = AF_INET;
  dstAddr.sin_port = htons(PORT);
  
  hp = gethostbyname(destination);
  bcopy(hp->h_addr, &dstAddr.sin_addr, hp->h_length);

  //ソケットの生成
  dstSocket = socket(AF_INET, SOCK_STREAM, 0);
  
  //接続
  if (connect(dstSocket, (struct sockaddr *)&dstAddr, sizeof(dstAddr)) < 0){
    printf("%s に接続できませんでした\n",destination);
    return(-1);
  }
  printf("%s に接続しました\n",destination);
  
  while(1) {
    len = 0;
    memset(filename, 0, sizeof(filename));

    printf("送信するファイル名を入力してください\n");
    printf("quitで終了します\n\n");
    scanf("%s",filename);

    if (!strcmp(filename, "quit")) {
      printf("->bye\n");
      write(dstSocket, "00quit", 6);
      close(dstSocket);
      break;
    }
    while(filename[len] != '\0') {
      len++;
    }
    len++;
    buf[0] = (len >> 8) & 0xFF;
    buf[1] = len & 0xFF;
  
    fp = open(filename, O_RDONLY);
    if (fp < 0) {
      printf("エラー: ファイルを開けません\n");
      return(-1);
    }
    
    
    fstat(fp, &statBuf);
    printf("filesize = %ld byte\n", statBuf.st_size);
    filesize[0] = (statBuf.st_size >> 24 ) & 0xFF;
    filesize[1] = (statBuf.st_size >> 16 ) & 0xFF;
    filesize[2] = (statBuf.st_size >> 8) & 0xFF;
    filesize[3] = statBuf.st_size & 0xFF;
    

    write(dstSocket, buf, 2);
    write(dstSocket, filesize, 4);
    write(dstSocket,filename, len);
    while (1){
      /* ファイルから読み込み */
      size = read (fp, buf, sizeof(buf));
      /* データが無ければループを抜ける */
      if (size <= 0) {
break;
      }
      //パケットの送信
      write(dstSocket, buf, size);
            
    }
    write(dstSocket,"filetransferred", sizeof("filetransferred"));
    printf("%s 転送完了しました\n\n",filename);
    close(fp);
  }
  close(dstSocket);
  return(0);
}

cpclientと同じディレクトリにファイルを置いておきます。
あとは実行してファイル名を指定するとをサーバー側にコピーすることができます。
 
実行例
./cpclient

送信するファイル名を入力してください
quitで終了します

crazy.mp3
filesize = 6211191 byte
crazy.mp3 転送完了しました
 

wgetのようなダウンロードプログラムを作ろう の続きです

ラズベリーパイを持っているなら、ネットワークプログラミングをしてみましょう。
echoサーバーとはネットワークにつながっているか確認するプログラムです。

TCP/IPネットワークプログラミング ここを改造しました。

変更点は何度も接続できるようにしたのと、クライエントからquit文字列を送ると切断できるようにしました。


echoserver.c 
ラズベリーパイで実行します。

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

#define PORT 9876

int main(){
    int i;
    int srcSocket;
    int dstSocket;
  
    struct sockaddr_in srcAddr;
    struct sockaddr_in dstAddr;
    int dstAddrSize = sizeof(dstAddr);
    // 各種パラメータ
    int status;
    int numrcv;
    char buf[1024];

  //sockaddr_in 構造体のセット
    bzero((char *)&srcAddr, sizeof(srcAddr));
    srcAddr.sin_port = htons(PORT);
    srcAddr.sin_family = AF_INET;
    srcAddr.sin_addr.s_addr = INADDR_ANY;
    
    srcSocket = socket(AF_INET, SOCK_STREAM, 0);
    bind(srcSocket, (struct sockaddr *)&srcAddr, sizeof(srcAddr));
    listen(srcSocket, 1);


while(1){
// 接続の受付け
    printf("接続を待っています\nクライアントプログラムを動かして下さい\n");
    dstSocket = accept(srcSocket, (struct sockaddr *)&dstAddr, &dstAddrSize);
    printf("%s から接続を受けました\n",inet_ntoa(dstAddr.sin_addr));
    
        
    while(1){
//パケットの受信
      numrcv = read(dstSocket, buf, 1024);
if(numrcv ==0 || numrcv ==-1 ){
close(dstSocket);
break;
}
if(!strcmp(buf, "quit")) {
write(dstSocket, "bye\n", 1024);
close(dstSocket);
break;
}
     
printf("変換前 %s", buf);
for (i = 0; i < numrcv; i++) {
if(isalpha(buf[i])) {
buf[i] = toupper(buf[i]);
}
}
      
// パケットの送信
    write(dstSocket, buf, 1024);
      fprintf(stdout,"> %s\n\n",buf);
}
}
close(srcSocket);
return(0);



echoclient.c 
PC側で実行します。

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

#define PORT 9876 //サーバープログラムとポート番号を合わせてください

int main(){
char destination[32] = "192.168.0.10";//サーバーマシンのIPアドレスを入れます。

//ソケット,sockaddr_in 構造体
int dstSocket;
struct sockaddr_in dstAddr;

//struct sockaddr_in addr;
  struct hostent *hp;
  char   buf[1024];
int    numrcv;

// 相手先アドレスの入力と送る文字の入力
  //printf("サーバーマシンのIPは?:");
//scanf("%s", destination);
  
  //sockaddr_in 構造体のセット
bzero((char *)&dstAddr, sizeof(dstAddr));
dstAddr.sin_family = AF_INET;
dstAddr.sin_port = htons(PORT);
  
  hp = gethostbyname(destination);
bcopy(hp->h_addr, &dstAddr.sin_addr, hp->h_length);

//ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);
  
  //接続
  if (connect(dstSocket, (struct sockaddr *)&dstAddr, sizeof(dstAddr)) < 0){
  printf("%s に接続できませんでした\n",destination);
    return(-1);
}
printf("%s に接続しました\n",destination);
printf("適当なアルファベットを入力してください\n");
  
while (1){
    scanf("%s",buf);
    //パケットの送信
    write(dstSocket, buf, 1024);
    //パケットの受信
    numrcv = read(dstSocket, buf, 1024);
if (!strcmp(buf, "bye\n")) {
printf("bye\n");
break;
}
    printf("→ %s\n\n",buf);
}
close(dstSocket);
return(0);
}



↑このページのトップヘ