• ベストアンサー

CGIで変数の値を送受信する方法

C言語で作成したCGIプログラムで、変数の値を送受信する方法を教えて頂けないでしょうか? 例えば、 int a; a=1; という、変数a の値 1 を、別のCGIプログラムに送信して、 別のCGIプログラムで受信をするといった具合です。

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

  • ベストアンサー
回答No.2

表示がくずれるの空白2文字を全角空白にしていることに注意。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <errno.h> void die(char *message) {   if (errno) {     perror(message);     exit(errno);   }   fprintf(stderr, "%s\n", message);   exit(1); } int creat_socket(char *proto, char *host) {   struct addrinfo hints, *res0, *res;   int       sock;   int       err;   memset(&hints, 0, sizeof(hints));   hints.ai_socktype = SOCK_STREAM;   hints.ai_family  = PF_UNSPEC;   err = getaddrinfo(host, proto, &hints, &res0);   if (0 != err) {     die("gai_strerror(err)");   }   for (res = res0; res != NULL; res = res->ai_next) {     /* printf("%d\n", res->ai_family); */     sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);     if (sock < 0) {       continue;     }     if (connect(sock, res->ai_addr, res->ai_addrlen) != 0) {       close(sock);       continue;     }     break;   }   freeaddrinfo(res0);   if (NULL == res) {     /* 有効な接続ができなかった */     die("failed");   }   return sock; } void recv_http_response(int sock) {   int n;   char buf[32];   n = 1;   /* サーバからのHTTPメッセージ受信 */   while (n > 0) {     n = read(sock, buf, sizeof(buf));     if (n < 0) {       die("read");     }     /* 受信結果を標準出力へ表示(ファイルディスクリプタ1は標準出力) */     write(fileno(stdout), buf, n);   } } void send_http_request_by_get(int sock, char *path, char *query) {   char buf[128];   int n;   /* リクエスト文字列を生成 */   snprintf(buf, sizeof(buf), "GET %s?%s HTTP/1.0\r\n\r\n", path, query);   /* HTTPリクエスト送信 */   n = write(sock, buf, (int)strlen(buf));   if (n < 0) {     die("write");   } } void send_http_request_by_post(int sock, char *path, char *query) {   char buf[128];   char line[128];   int n;   /* リクエスト文字列を生成 */   buf[0] = '\0';   snprintf(line, sizeof(line), "POST %s HTTP/1.0\r\n", path);   strncat(buf, line, sizeof(buf));   snprintf(line, sizeof(line), "Content-type: application/x-www-form-urlencoded\r\n");   strncat(buf, line, sizeof(buf));   snprintf(line, sizeof(line), "Content-Length: %d\r\n", strnlen(query, 128));   strncat(buf, line, sizeof(buf));   snprintf(line, sizeof(line), "\r\n");   strncat(buf, line, sizeof(buf));   snprintf(line, sizeof(line), "%s\r\n", query);   strncat(buf, line, sizeof(buf));   /* HTTPリクエスト送信 */   n = write(sock, buf, (int)strlen(buf));   if (n < 0) {     die("write");   } } int main(int argc, char *argv[]) {   int  sock;   char *host, *proto, *path, *query;   int  n;   /* example */   /* ./a.out http localhost / a=1 */   if (5 != argc) {     die("Usage : prog proto dest");   }   proto = argv[1];   host = argv[2];   path = argv[3];   query = argv[4];   /* GET */   printf("--- GET\n");   sock = creat_socket(proto, host);   send_http_request_by_get(sock, path, query);   recv_http_response(sock);   if ( 0 > close(sock)) {     die("close");   }   /* POST */   printf("\n--- POST\n");   sock = creat_socket(proto, host);   send_http_request_by_post(sock, path, query);   recv_http_response(sock);   if ( 0 > close(sock)) {     die("close");   }   return 0; } --- $ ./a.out 5000 localhost / foo=1 --- GET HTTP/1.0 200 OK Date: Sun, 16 Dec 2012 04:50:23 GMT Server: HTTP::Server::PSGI Content-Type: text/plain Content-Length: 21 Method : GET foo : 1 --- POST HTTP/1.0 200 OK Date: Sun, 16 Dec 2012 04:50:23 GMT Server: HTTP::Server::PSGI Content-Type: text/plain Content-Length: 22 Method : POST foo : 1

arupaka753
質問者

お礼

ありがとうございます、助かります。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

他の言語ならできますか? それをC言語に移植することはできませんか?

arupaka753
質問者

お礼

ご回答ありがとうございます。

関連するQ&A