ページ 11

なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 13:34
by helloworld1853
http://s1.muryo.etowns.net/~yamada_mama_papa/test.cgi

の namae にデータをPOSTするプログラムを作っています。

以下がソースコードです。

コード:

#include <stdio.h>
#ifdef _MSC_VER
#include <winsock2.h>
#else
#include <sys/unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#endif

int main( void )
{
	int sock, ret;
	struct sockaddr_in addr;

#ifdef _MSC_VER
	{
	WSADATA wsadata;
	WSAStartup( 0x0101, &wsadata );
	}
#endif

	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = inet_addr("124.96.235.80");
	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;
	}
	
	char body[] = "namae=2222222222222222222222\r\n";
	char head[] = "POST /~yamada_mama_papa/test.cgi HTTP/1.0\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 );
	
	char buf[256];
	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 );
	}
#ifdef _MSC_VER
	closesocket( sock );
#else
	close( sock );
#endif
}
このソースコードをVisual C++でコンパイルすると

HTTP/1.1 404 Not Found
    ・
    ・
    ・
   省略

と表示されます。

ファイルは確かに存在するはずですが、

また、IPアドレスもあっているはずですが・・・

原因はなんでしょうか?

ご回答をお待ちしております。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 13:51
by YuO
細かいことはみていませんが,単に名前ベースの仮想ホストだからではないでしょうか。

コード:

nslookup s1.muryo.etowns.net

コード:

名前:    muryo.etowns.net
Address:  124.96.235.80
Aliases:  s1.muryo.etowns.net
となりますが,

コード:

nslookup s2.muryo.etowns.net
としても,

コード:

名前:    muryo.etowns.net
Address:  124.96.235.80
Aliases:  s2.muryo.etowns.net
が得られます。

というわけで,hostフィールドをヘッダに追加すればよいと思います。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 14:13
by helloworld1853
原因は分かりましたが

どう解決すればいいか分からず

適当に

コード:

char head[] = "POST /~yamada_mama_papa/test.cgi HTTP/1.0\r\n";

コード:

char head[] = "POST /~yamada_mama_papa/test.cgi HTTP/1.0\r\nHost: s1.muryo.etowns.net\r\n";
に変更しました。

これでいいのでしょうか。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 15:37
by helloworld1853
上記の変更を適用し

実行して見たところ、

今度は500エラーが返ってきました。

CGIに問題があるようです。

批判を覚悟の上でC言語の提示板にPerlのソースコードをはります。

ざっと見ておかしい所はありますか?

コード:

#!/usr/local/bin/perl
use CGI;
$q = new CGI;
$Name = $q->param('namae');
print $Name;
open (OUT,"> test.txt");
print OUT $Name;
close (OUT);
print "Content-type: text/html\n\n";
print "<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
print 'sucess';
exit;

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 16:14
by h2so5
perlのエラーメッセージを確認しましたか?

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 16:32
by helloworld1853
エラー メッセージとはなんですか。

コマンドプロンプトに表示されている文字のことですか。

しかし、普通にアクセスすると

ちゃんと動作しているのに

アプリケーションを介すると

エラー を起こすというのは

不思議です。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 17:58
by YuO
helloworld1853 さんが書きました:しかし、普通にアクセスすると
ちゃんと動作しているのに
アプリケーションを介すると
エラー を起こすというのは
不思議です。
本当に同等の動作をしていますか。単にアプリケーション側のバグではないですか。
先のHostもそうですが,通信データに不備があるのではないでしょうか。
例えばIEのF12 開発者ツールのネットワークキャプチャ機能等でPOSTのヘッダを調べて,それと同じ出力ができているか調べる,などはしましたか。

ぱっと見た感じだと,Content-Typeの指定をしていないのは致命傷に思えますが。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 20:53
by みけCAT
Content-Typeを出力する前に$Nameの内容を出力しているのが問題のような気がします。

Re: なぜかファイルが存在していないことになっている。

Posted: 2012年4月18日(水) 23:04
by helloworld1853
皆様のおかげで無事解決しました。

どうやら問題はtest.cgiにあったようでした。

perlですが、一応ソースコードを載せておきます。

コード:

#!/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.txt");
print OUT $Name;
close (OUT);
print 'sucess';
exit;
みなさま本当に有難うございました。