コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

ndsでのjpeg表示に再挑戦(2)

昨日、美人さんの画像がうまく取得できなかった原因がわかりました。DSがWiFi通信のデータ取得の際に、何かのタイミングで473バイト取りこぼしてしまっているようです。
取りこぼす原因を調べたのですが、最初のパケットデータを取得した後に、保存のためにファイルをオープンすると、次のパケットの頭から473バイトが欠落するようです。ファイルオープンと473バイト欠落の因果関係はわかりませんが、ファイルをオープンした後に、データ取得を行えば、欠落しないことがわかりました。

美人さん画像の取得プログラム

画像データ取得の際に、ヘッダをカットするようにプログラムを作りました。後、送信ヘッダも色々試して、これだけ送信しておこう。というものだけにしました。

FILE*  fp = NULL;
char  toptext[512];
int    i, j;
char  *servername = "www.bijint.com";
char  *getfilename = "/jp/img/clk/";
char  buf[32];
char  savefilename[32];
int    httpgetdatasize = 32768;
int    portnum = 80;
long  recvd_len;

  time_t unixTime = time( NULL );
  struct tm* timeStruct = gmtime((const time_t *)&unixTime);
  sprintf( buf, "%02d%02d.jpg", timeStruct->tm_hour, timeStruct->tm_min );
  strcpy( savefilename, buf );
 
  //********** http GET コマンド生成 **********
  strcpy( toptext, "GET " );
  strcat( toptext, getfilename );
  strcat( toptext, buf );
  strcat( toptext, " HTTP/1.1\r\n" );
  strcat( toptext, "Host: " );
  strcat( toptext, servername );
  strcat( toptext, "\r\n" );
  strcat( toptext, "User-Agent: Nintendo DS\r\n" );
  strcat( toptext, "Referer: http://www.bijint.com/\r\n\r\n" );
  //*******************************************
  
  ShinoPrintBox( MainScreenA, 0, 0, (u8*)toptext, 40, RGB(31,31,31), RGB(0,0,0), 1 );

  nkeywait( -1 );
  anyNyuryoku();

  // サーバのIPアドレスを検索します
  struct hostent * myhost = gethostbyname( servername );

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

  //ホストに接続するため、指定IPアドレスの指定ポートに接続します。
  struct sockaddr_in sain;
  sain.sin_family = AF_INET;
  sain.sin_port = htons( portnum );  //ポート指定
  sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) );  //IP指定
  connect( my_socket,(struct sockaddr *)&sain, sizeof(sain) );

  //接続先にファイル取得リクエストを飛ばします
  send( my_socket, toptext, strlen(toptext), 0 );

  //メモリの確保
  char *incoming_buffer = (char*)malloc( sizeof(char*) * httpgetdatasize );
  if(incoming_buffer==NULL ){
    ShinoUpPrint( SubScreenA, (u8 *)"Malloc Error", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) );
    while( true );
  }

  //ファイルオープン
  fp = fopen( savefilename, "wb" );
  if( fp==NULL ){
    ShinoUpPrint( SubScreenA, (u8 *)savefilename, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) );
    ShinoUpPrint( SubScreenA, (u8 *)"not create.", RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) );
    while( true );
  }

  //データ取得
  recvd_len = getRecvData( my_socket, incoming_buffer, httpgetdatasize, 0, 100000L );

  //recvd_len>0か返事が 200 OK であるかどうか調べる
  if( strexist( incoming_buffer, (char *)"200", 20)==true
    && strexist( incoming_buffer, (char *)"OK", 20)==true
    && recvd_len>0 ){
    //*** メッセージの送受信成功 ***
    //最初のパケットが"HTTP/1.x 200 OK"のみかどうか調べます
    if( recvd_len<=15 ){
      //15バイト以下だったら再読み込みする
      recvd_len = getRecvData( my_socket, incoming_buffer, httpgetdatasize, 0, 100000L );
    }
    //[0x0D][0x0A][0x0D][0x0A]の4バイトを探す
    for( j=0; j<recvd_len-3; j++ ){
      if( incoming_buffer[j]==0x0d && incoming_buffer[j+1]==0x0a 
        && incoming_buffer[j+2]==0x0d && incoming_buffer[j+3]==0x0a ){
        //見つかった
        for( i=j+4; i<recvd_len; i++ ){
          incoming_buffer[i-(j+4)] = incoming_buffer[i];
        }
        recvd_len -= (j+4);
        break;
      }
    }
  }

  //*** 受信データを保存 ***
  fwrite( incoming_buffer, recvd_len, sizeof(char), fp );
    
  //データサイズが0になるまで、データを取得します
  while( ( recvd_len = getRecvData( my_socket, incoming_buffer, httpgetdatasize, 0, 100000L ) ) != 0 ){
    if( recvd_len>0 ){
      swiWaitForVBlank();  
      fwrite( incoming_buffer, recvd_len, sizeof(char), fp );
    }
  }

  fclose( fp );

  //メモリの開放
  free( incoming_buffer );
  
  //ソケットをシャットダウンします
  shutdown(my_socket,0);

  //少し間をおく(こうしないとソケットが切れない・・・)
  for( i=0; i<20; i++ ){  swiWaitForVBlank();  }
  
  //ソケットを閉じます
  closesocket( my_socket );

さて、これで、"時分.jpg" というデータが取得できたわけですが、やっとこれからスタートです。jpegのデコードプログラムを考えて行きたいと思います。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム