• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CGIと通信するプログラムを作っています。)

CGIと通信するプログラムのPOST方法について教えてください

このQ&Aのポイント
  • CGIと通信するプログラムを作っています。GETの時はそのままアドレスを入力して接続できるのですが、POSTのCGIと通信する方法がよくわかりません。どなたか教えてください。
  • 作成中のプログラムではCGIと通信する必要があります。GETの場合はURLを入力するだけで通信できるのですが、POSTの場合はどのように通信すれば良いのかがわかりません。アドバイスがある方は教えてください。
  • 現在、CGIと通信するプログラムを作っています。GETメソッドの場合は問題なく通信できるのですが、POSTメソッドの通信方法がわかりません。どなたか詳しい方がいらっしゃいましたら、教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • butarou
  • ベストアンサー率24% (7/29)
回答No.1

GETメソッドの場合、URLの後ろにつけたパラメタはQUERY_STRINGという環境変数で渡されますが、POSTメソッドの場合は標準入力でパラメタを渡す必要があります。 見たところWinInetを使っているようですので、こちらのページを参考にしてみてください。

参考URL:
http://support.microsoft.com/kb/q165298/
BPG
質問者

お礼

回答ありがとうございます 助かりました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jpgファイルのダウンロード

    WWWサーバー上にあるjpgファイルを指定してそれをダウンロードするプログラムをつくっています。 jpgファイルが作成されることはされるのですが、中身をみることができない状態になってしまいます。 どこが悪いのかわかる方がおられましたらご教授お願いします。 <ソースコード> #include <windows.h> #include <stdio.h> #include <wininet.h> int main(void) { HINTERNET hInet, hUrl; char szBuf[128], szUrl[128], *lpszSrc; DWORD dwRead, dwTotal = 0; HGLOBAL hMem; FILE *file; printf("URL---- "); gets(szUrl); hInet = InternetOpen(TEXT("neko"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hInet == NULL){ perror("オープンエラー\n"); return -2; } hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0); if(hUrl == NULL){ perror("URLオープンエラー\n"); return -3; } hMem = GlobalAlloc(GHND, 1); lpszSrc = (char*)GlobalLock(hMem); while(1){ InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf)-1, &dwRead); szBuf[dwRead] = '\0'; if(dwRead == 0){ break; } dwTotal += dwRead; hMem = GlobalReAlloc(hMem, dwTotal+1, GMEM_MOVEABLE); lpszSrc = (char*)GlobalLock(hMem); strcat(lpszSrc, szBuf); } if((file = fopen("test.jpg", "wb")) == NULL){ printf("ファイルオープンエラー\n"); goto end; } while(dwTotal){ fputc(*lpszSrc, file); lpszSrc++; dwTotal--; } fclose(file); end: GlobalUnlock(hMem); GlobalFree(hMem); InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0; } <環境> Windows Vista VC++ 2005 EE

  • htmlソースを一文字ずつ取得するには・・

    私は猫でもわかるネットワークプログラミングをよんでふと思ったのですが・ HTMLソースを空白行も含め縦に並べたいのです たとえば・・ < h t m l > ってな感じで・・ つまりは printf("%s(%cでも・・)",一文字); ってな感じにしたいのです・・ 一応作りかけのソース張っておきます。。。。 wininet使ってます・・ //省略 //インターネット(wininet)開始 hInet = InternetOpen("ユーザー名収集プロトタイプ",INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0); hUrl = InternetOpenUrl(hInet,szUrl,NULL,0,0,0); //lpszSrcに1バイトのみ確保 hMem = GlobalAlloc(GHND,1); lpszSrc = (char *)GlobalLock(hMem); //読み出すものがなくなるまで読み出す while(1){ InternetReadFile( hUrl,szBuf,(DWORD)sizeof(szBuf) - 1,&dwRead); szBuf[dwRead] = '\0'; //読み出すものが無くなったらループを脱出 if (dwRead == 0){ break; } //必要バイト数の計算 dwTotal += dwRead; //確保領域の大きさ変更 hMem = GlobalReAlloc(hMem,dwTotal,GMEM_MOVEABLE); if(hMem == NULL){ perror("再アロケート失敗\n"); } lpszSrc = (char *)GlobalLock(hMem); if(lpszSrc == NULL){ perror("メモリ領域確保に失敗\n"); break; } strcat(lpszSrc,szBuf); printf("%s\n",szBuf); } //メモリの開放 GlobalUnlock(hMem); GlobalFree(hMem); //インターネットハンドルの開放 InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0; }

  • InternetOpengaが使えません・・・。

    すみません。 どーしてもできません。教えてください。 下記のプログラムを走らせたいのですが、エラーが直りません。 開発環境はVC++2008です。 プロジェクト新規でwin32コンソールアプリケーションを選択し、 空のプロジェクトを作成したあと、 WinInet.Libを追加しています。 下記のプログラムで、下記のようなエラーがでます。。。、 ------ ビルド開始: プロジェクト: readhtml, 構成: Debug Win32 ------ コンパイルしています... readhtml.cpp warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(279) : 'gets' の宣言を確認してください。 error C2664: 'InternetOpenW' : 1 番目の引数を 'const char [16]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 error C2664: 'InternetOpenUrlW' : 2 番目の引数を 'char [128]' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。 readhtml - エラー 2、警告 1 ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== ある本を見ながら、作成し、サンプルどおりに作っているのですが・・。 #include <windows.h> #include <stdio.h> #include <wininet.h> int main() { HINTERNET hInet,hUrl; char szBuf[128],szUrl[128],*lpszSrc; DWORD dwRead,dwTotal = 0; HGLOBAL hMem; //目的のURLの入力 printf("URL---"); gets(szUrl); //インターネット(WinInet)の開始 hInet = InternetOpen("nekodemo-wakaru", INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0); if (hInet == NULL){ perror("オープンエラー\n"); return -2; } //HTTPセッションの開始、指定のURLオープン hUrl = InternetOpenUrl(hInet,szUrl,NULL,0,0,0); if (hUrl == NULL){ perror("URLオープンエラー\n"); InternetCloseHandle(hInet); return -3; } //lpszSrcに1バイトのみ確保 hMem = GlobalAlloc(GHND,1); lpszSrc = (char *)GlobalLock(hMem); //読み出すものがなくなるまで読み出す while(1){ InternetReadFile( hUrl, szBuf, (DWORD)sizeof(szBuf) - 1 , &dwRead); szBuf[dwRead] = '\0'; //読み出すものがなくなたのでループ脱出 if (dwRead == 0){ break; } //必要バイト数の計算 dwTotal += dwRead; //確保領域の大きさ変更 hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE); if (hMem == NULL){ perror("再アロケート失敗\n"); } lpszSrc = (char *)GlobalLock(hMem); if (lpszSrc == NULL) { perror("メモリ確保に失敗\n"); break; } strcat(lpszSrc,szBuf); } //ソースの表示 printf("%s\n",lpszSrc); //メモリの開放 GlobalUnlock(hMem); GlobalFree(hMem); //インターネットハンドルの開放 InternetCloseHandle(hUrl); InternetCloseHandle(hInet); return 0 ; }

  • 【C&C++】文字コードEUCをShift-JISに変換したい

    WinInetで指定したURLのHTMLを表示するコンソールプログラムを作成したのですが、EUCで書かれたWebページが文字化けをしてしまいます。 Shift-JISで書かれているWebページは特に問題なく、自分もEUCからShift-JISに変換したいと考えています。しかし、色々と参考書やWebなどを調べてみたのですが、自分には少し難しすぎてより分かりやすい説明を求めています。 データの読み出しはInternetReadFileを使用しています。以下がそのソースです。 while (1) { InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead); szBuf[dwRead] = '\0'; if (dwRead == 0) break; str = str + szBuf; } どうかご回答よろしくお願いします。

  • 【C&C++】EUC_JPをSHIFT-JISに変換したい

    WinInetで指定したURLのHTMLを表示するコンソールプログラムを作成したのですが、EUC_JPで書かれたWebページが文字化けをしてしまいます。 SHIFT-JISで書かれているWebページは特に問題なく、自分もEUC_JPからSHIFT-JISに変換したいと考えています。しかし、色々と参考書やWebなどを調べてみたのですが、自分には少し難しすぎてより分かりやすい説明を求めています。 データの読み出しはInternetReadFileを使用しています。以下がそのソースです。 while (1) { InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead); szBuf[dwRead] = '\0'; if (dwRead == 0) break; str = str + szBuf; } どうかご回答よろしくお願いします。

  • VC++ HttpOpenRequest() 正しく終了しない。

    MFC-dllを作成してVBで使用しようと思っています。 DLLの中ではWebサーバーに接続してデータを取得して VBで使う感じです。 DLLの中でダイアログボックスを一個作ってその中で実際のサーバーとの通信を行います。次のコードはそのDLL中のダイアログボックスの中でボタンを押したとき実行される関数です。 動きとしてはサーバーに接続し、データを正しく取得できますが、問題はこのDLLを使っているVBプログラムが終了してもWindows タスクマネージャーを見ると終了されてない状態です(デスクトップ画面上では終了されています)。しばらくしたら『応答なし』になって結局2~3分たったら自動に消滅されるのですが何だか感じ悪いです。コードの中に何か問題があるかどうか教えてください。 Void CTest::GetA (){ CHAR buffer[2048]; DWORD dwRead; char Header[]="Content-Type: application/x-www-form-urlencoded\n"; char Data[]="name=JohnDoe"; HINTERNET hINet=InternetOpen("V1.0",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); HINTERNET hCon=InternetConnect(hINet,"localhost",8080,"","", INTERNET_SERVICE_HTTP,0,0); HINTERNET hData = HttpOpenRequest(hConnection,"POST","/test001.asp",NULL,NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,0); HttpSendRequest( hData, Header, strlen(Header),Data,strlen(Data)); while( InternetReadFile( hData, buffer, 255, &dwRead ) ) { if ( dwRead == 0 ) break; buffer[dwRead] = 0; m_strContents += buffer; } InternetCloseHandle(hCon); InternetCloseHandle(hINet); InternetCloseHandle(hData); }

  • PICとPCでのシリアル通信

    PICとPC間でのシリアル通信を行ってるんですけどうまくいきません。ハイパーターミナル使えばうまくいくんでPIC側のソース(C)はうまくいってると思います。ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。。。 アドバイスなどお願いします!!どこが違うんでしょうか。。。 ●PC側のソース(C++) #include "stdafx.h" #include <stdlib.h> #include <windows.h> #include<iostream> using namespace std; #define COM_PORT_NAME "COM1" #define BAUD_RATE 9600 #define BYTE_SIZE 8 #define PARITY EVENPARITY #define STOP_BIT TRUE #define F_PARITY ONESTOPBIT HANDLE hComm; // シリアルポートとの通信ハンドル bool ComInit() { // シリアルポートを開ける hComm = CreateFile( COM_PORT_NAME, /* シリアルポートの文字列 */ GENERIC_READ | GENERIC_WRITE, /* アクセスモード:読み書き */ 0, /* 共有モード:他からはアクセス不可 */ NULL, /* セキュリティ属性:ハンドル継承せず */ OPEN_EXISTING, /* 作成フラグ: */ FILE_ATTRIBUTE_NORMAL, /* 属性: */ NULL /* テンプレートのハンドル: */ ); if (hComm == INVALID_HANDLE_VALUE) { printf("シリアルポートを開くことが出来ませんでした。\n"); return false; } // 通信属性を設定する DCB dcb; GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = BAUD_RATE; dcb.ByteSize = BYTE_SIZE; dcb.Parity = PARITY; dcb.fParity = STOP_BIT; dcb.StopBits = F_PARITY; SetCommState(hComm, &dcb); /* DCB を設定 */ return true; } void ComEnd() { // ハンドルを閉じる CloseHandle(hComm); } bool WriteData(char *buff, unsigned int data_size) { DWORD dwWritten; /* ポートへ書き込んだバイト数 */ WriteFile(hComm, buff, data_size, &dwWritten, NULL); if (dwWritten!=data_size) { printf("データの送信に失敗しました。\n"); return false; } return true; } bool ReadData(char *buff, unsigned int max_size) { DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ DWORD dwCount; /* 受信データのバイト数 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ClearCommError(hComm, &dwErrors, &ComStat); dwCount = ComStat.cbInQue; if (dwCount > max_size) { printf("バッファサイズが足りません。\n"); return false; } ReadFile(hComm, buff, dwCount, &dwRead, NULL); if (dwCount != dwRead) { printf("データの受け取りに失敗しました。\n"); return false; } return true; } int main(int argc, char* argv[]) { char ch; while(1){ cin >> ch; printf("入力 %c\n", ch); ComInit(); WriteData(&ch, strlen(&ch)); ReadData(&ch, strlen(&ch)); ComEnd(); } return 0; }

  • VC++のHTTP通信

    VC++2010でHTTP通信のサンプルプログラムを走らせてみたのですが、どうも上手く行きません。 ソースは以下の通りです。 #include <stdio.h> #include <winsock2.h> int main() { WSADATA wsaData; LPHOSTENT lpHost; SOCKET s; int nRtn; SOCKADDR_IN sockadd; char szServer[256], szURL[256], szStrRcv[1024], szPort[8]; char szStr[256], szYN[4]; u_short port; unsigned int addr; while (1) { // WinSockを初期化 if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { perror("WSAStartupエラーです\n"); return -1; } // サーバ名、ポート番号、ファイル名を取得 printf("Webサーバ名----"); gets_s(szServer); printf("ポート番号----"); gets_s(szPort); if (strcmp(szPort, "") == 0) strcpy_s(szPort, "80"); port = (u_short)atoi(szPort); printf("ファイル名----"); gets_s(szURL); if (strcmp(szURL, "") == 0) strcpy_s(szURL, "/"); // ソケットをオープン s = socket(PF_INET, SOCK_STREAM, 0); if (s == INVALID_SOCKET) { perror("ソケットをオープンできません\n"); WSACleanup(); return -2; } // ホスト名からホスト情報を取得 lpHost = gethostbyname(szServer); if (lpHost == NULL) { // アドレスを表す文字列を数値表現に変換 addr = inet_addr(szServer); // ネットワークアドレスからホスト情報を取得 lpHost = gethostbyaddr((char *)&addr, 4, AF_INET); if (lpHost == NULL) { wsprintf(szStr, "%sが見つかりません\n", szServer); perror(szStr); WSACleanup(); return -3; } } // SOCKADDR_IN構造体に必要事項をセット memset(&sockadd, 0, sizeof(sockadd)); sockadd.sin_family = AF_INET; sockadd.sin_port = htons(port); sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); // ソケットに接続 if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd)) != 0) { perror("サーバソケットに接続失敗\n"); closesocket(s); WSACleanup(); return -4; } // GETリクエストを送信 wsprintf(szStr, "GET %s HTTP/1.0\r\n\r\n", szURL); nRtn = send(s, szStr, (int)strlen(szStr), 0); while(1) { // 受信用バッファ(szStrRcv)をゼロクリア memset(szStrRcv, '\0', sizeof(szStrRcv)); // データを受信 nRtn = recv(s, szStrRcv, (int)sizeof(szStrRcv) - 1, 0); // 受信したデータを標準出力に書き出す printf("%s", szStrRcv); if (nRtn == 0) break; if (nRtn == SOCKET_ERROR) { perror("recvエラーです\n"); break; } } if (shutdown(s, SD_BOTH) != 0) { // シャットダウン perror("シャットダウンに失敗しました\n"); } closesocket(s); // ソケットをクローズ WSACleanup(); // WinSockのリソースを解放 printf("\nもう一度実行しますか(Y/N)----"); gets_s(szYN); if (strcmp(szYN, "n") == 0 || strcmp(szYN, "N") == 0) break; } return 0; } 例えば、ttp://kumei.jp/c_lang/を開こうしとて、 kumei.jp 80 /c_lang/index.html と入力した場合は上手くレスポンスが帰ってきますが、 googleに接続しようと思い、 www.google.co.jp 80 / と入力すると 302 Moved と帰ってきます。 しかし www.google.co.jp 80 www.google.co.jp と入力した場合は問題なくgoogleのトップページが帰ってきます。 また、ttp://hako.gob.jp/にアクセスしようとして、 hako.gob.jp 80 /index.html と入力した場合 DOMAIN ERROR が帰ってきます。 さらに、 hako.gob.jp 80 hako.gob.jp と入力すると 400 エラーが帰って来ました。 私はwindowsプログラムに関しては全くの素人で分からない事だらけの状態です。できるだけ分り易く書いて頂けると嬉しいです。私が教えて頂きたいことは以下のことです。 ・サイト(通信相手?)による違いはどこで生まれるのでしょうか? ・また、正しくはどのように入力すれば良いのでしょうか?それはどうすれば分かるのでしょうか? ・アドレスを指定しただけであとはプログラムに自動で判断してもらうにはどうすれば良いでしょうか? ・そもそも、このプログラムでは根本的に不可能な事をやろうとしているのでしょうか?もしそうであった場合どうすれば良いでしょうか? 質問だらけで申し訳ありません。誰か分かる方がいらっしゃれば教えて下さい。

  • シリアル通信でのデータ受信

    シリアル通信にてデータを連続的に受信するプログラムを つくりたいと思っています. 以下のプログラムを作成して, main関数のcountを増やして,繰り返しreadを行おうとすると, 出力結果として, 時,分,秒,ID,値B,値C,値Dというフォーマットで 0, 9,30, 1,514,708,542,290 0, 9,30, 2,515,707,542,288 0, 9,30, 3,514,709,542,287 0, 9,30, 4,514,707,543,289 0, 9,30, 5,514,708,542,289 0, 9,30, 6,514,708,542,292 0, 9,30, 7,514,708,542,291 0, 9,30, 8,514,708,542,289 0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289 (この後フが連続) フフフフフフフフフフフフフフフ ク 0, 9,39,36,514,708,542,290 0, 9,39,37,515,709,541,291 0, 9,39,38,514,707,542,286 0, 9,39,39,514,708,542,281 0, 9,39,40,514,708,542,284 0, 9,39,41,514,707,542,286 0, 9,39,42,514,707,542,290 0, 9,39,43,514,709,542,290 0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289 フフフフフフフフフ・・・再びフ となってしまいます. 問題としては ・フがたくさんでてきてしまう. ・1サイクルの最後で改行ができていない ・1サイクルが終わって次のサイクルに入る時までの 間にデータが失われている. ・2サイクル目になぜか1サイクル目の値が残っている? などがあります. どなたか解決方法を教えていただけると大変助かります. よろしくお願いします. ------------------------------- #include "stdafx.h" #include <stdlib.h> #include <windows.h> #include <string.h> #include <stdio.h> #define COM_PORT_NAME "COM2" #define BAUD_RATE 57600 #define BYTE_SIZE 5000 //250 #define PARITY NOPARITY //EVENPARITY #define STOP_BIT TRUE #define F_PARITY ONESTOPBIT HANDLE hComm; // シリアルポートとの通信ハンドル bool ComInit() { // シリアルポートを開ける hComm = CreateFile( COM_PORT_NAME, /* シリアルポートの文字列 */ GENERIC_READ | GENERIC_WRITE, /* アクセスモード:読み書き */ 0, /* 共有モード:他からはアクセス不可 */ NULL, /* セキュリティ属性:ハンドル継承せず */ OPEN_EXISTING, /* 作成フラグ: */ FILE_ATTRIBUTE_NORMAL, /* 属性: */ NULL /* テンプレートのハンドル: */ ); if (hComm == INVALID_HANDLE_VALUE) { printf("シリアルポートを開くことが出来ませんでした。\n"); return false; } // 通信属性を設定する DCB dcb; GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = BAUD_RATE; dcb.ByteSize = BYTE_SIZE; dcb.Parity = PARITY; dcb.fParity = STOP_BIT; dcb.StopBits = F_PARITY; SetCommState(hComm, &dcb); /* DCB を設定 */ return true; } void ComEnd() { // ハンドルを閉じる CloseHandle(hComm); } bool ReadData(char *buff, unsigned int max_size) { DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ DWORD dwCount; /* 受信データのバイト数 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ClearCommError(hComm, &dwErrors, &ComStat); dwCount = ComStat.cbInQue; FILE *fid; fid=fopen("test.txt", "w"); printf("%d %d\n", dwCount, max_size); fprintf(fid,"%d %d\n", dwCount, max_size); fclose(fid); if (dwCount > max_size) { printf("バッファサイズが足りません。\n"); return false; } if(hComm != NULL){ ReadFile(hComm, buff, dwCount, &dwRead, NULL); if (dwCount != dwRead) { printf("データの受け取りに失敗しました。\n"); return false; } } return dwRead; } int main(int argc, char* argv[]) { char buff[BYTE_SIZE]; int count = 0; int data_length; FILE *fid2; fid2=fopen("test2.txt","w"); ComInit(); while(1){ if(count == 2) break; count++; data_length=ReadData(buff, strlen(buff)); printf("%s ",buff); fprintf(fid2, "%s ",buff); } fclose(fid2); ComEnd(); return 0; }

  • CGIで送受信するプログラムの作り方

    入力フォームを返すのとフォームからのPOSTとGETを受け取って処理する、 同一のスクリプトを、CGI、C言語で作成致しましたが、 上手く動作していません。(白紙のページが表示されるだけでした。) getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは? こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。 何も送信していないのに、GETと判断されているのは何故でしょうか? また、正しい動作をするプログラムをご提示頂けますと助かります。 /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data,*method,*qs; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); method = getenv("REQUEST_METHOD"); printf("%s\n", method); if(method == NULL){ printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("<form method=\"get\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); exit(0); } //POST else if(!strcmp(method, "POST")){ clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ exit(0); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } //GET else if(!strcmp(method, "GET")){ qs = getenv("QUERY_STRING"); printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", qs); printf("</body></html>\n"); } printf("</body></html>\n"); } 宜しくお願いいたします。

    • ベストアンサー
    • CGI