流れとしては
まず、プログラムがtest.bmpをバイナリモードで開きデータをchar bodyに保存
char bodyをtest.cgiにpost
test.cgiがそれをもとにtest.bmpを作成
画像アップロード 成功!!
です。
画像のバイナリコードは
42 4D E4 0A 00 00 00 ・・・
です。
しかし、00の箇所をソケットの通信終了合図だと勘違いしてしまい、
結局画像は42 4D E4 0Aで止まってしまいます。
通信系のプログラミングはまだなれていないので
お手柔らかにお願いします。
#include <stdio.h>
#include <winsock2.h>
int main( void )
{
int sock, ret;
struct sockaddr_in addr;
FILE *fp;
char *fname = "test.bmp";
char buf[100000];
char body[100000];
int i;
int size;
WSADATA wsadata;
WSAStartup( 0x0101, &wsadata );
fp = fopen( fname, "rb" );
size = fread( buf, sizeof( unsigned char ), 10000, fp );
for( i=0; i<size; i++ )
{
printf( "%02X ", buf[i] );
}
puts("");
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("125.172.197.18");
addr.sin_port = htons(80);
sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
ret = connect( sock, (struct sockaddr *)&addr, sizeof addr );
if ( ret < 0 )
{
printf( "can't open http port\n" );
return 0;
}
sprintf(body,"namae=%s\r\n",buf);
body[size+6]='\0';
char head[] = "POST /~yamada_mama_papa/test.cgi HTTP/1.0\r\nHost: s1.muryo.etowns.net\r\n";
char length[100];
sprintf( length, "Content-Length: %d\r\n", strlen(body) );
int n = 0;
n += send( sock, head, strlen(head), 0 );
n += send( sock, length, strlen(length), 0 );
n += send( sock, "\r\n", 2, 0 );
n += send( sock, body, strlen(body), 0 );
printf( "send: %d\n", n );
printf( "http recv data\n" );
printf( "=============================\n" );
while ( 1 )
{
n = recv( sock, buf, sizeof(buf)-1, 0 );
if ( n <= 0 ) break;
buf[ n ] = '\0';
printf( buf );
}
closesocket( sock );
fclose( fp );
}
#!/usr/local/bin/perl
use CGI;
$q = new CGI;
$Name = $q->param('namae');
print "Content-type: text/html\n\n";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
print $Name;
open (OUT,"> test.bmp");
print OUT $Name;
close (OUT);
print 'sucess';
exit;
[]/code]
よろしくお願いします。