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系のプログラム