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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
helloworld1853
記事: 181
登録日時: 14年前

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

#1

投稿記事 by helloworld1853 » 14年前

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アドレスもあっているはずですが・・・

原因はなんでしょうか?

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

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

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

#2

投稿記事 by YuO » 14年前

細かいことはみていませんが,単に名前ベースの仮想ホストだからではないでしょうか。

コード:

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フィールドをヘッダに追加すればよいと思います。

helloworld1853
記事: 181
登録日時: 14年前

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

#3

投稿記事 by helloworld1853 » 14年前

原因は分かりましたが

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

適当に

コード:

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";
に変更しました。

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

helloworld1853
記事: 181
登録日時: 14年前

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

#4

投稿記事 by helloworld1853 » 14年前

上記の変更を適用し

実行して見たところ、

今度は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;

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

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

#5

投稿記事 by h2so5 » 14年前

perlのエラーメッセージを確認しましたか?

helloworld1853
記事: 181
登録日時: 14年前

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

#6

投稿記事 by helloworld1853 » 14年前

エラー メッセージとはなんですか。

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

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

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

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

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

不思議です。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

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

#7

投稿記事 by YuO » 14年前

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

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#8

投稿記事 by みけCAT » 14年前

Content-Typeを出力する前に$Nameの内容を出力しているのが問題のような気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

helloworld1853
記事: 181
登録日時: 14年前

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

#9

投稿記事 by helloworld1853 » 14年前

皆様のおかげで無事解決しました。

どうやら問題は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;
みなさま本当に有難うございました。

閉鎖

“C言語何でも質問掲示板” へ戻る