- ベストアンサー
CGIで変数の値を送受信する方法
C言語で作成したCGIプログラムで、変数の値を送受信する方法を教えて頂けないでしょうか? 例えば、 int a; a=1; という、変数a の値 1 を、別のCGIプログラムに送信して、 別のCGIプログラムで受信をするといった具合です。
- みんなの回答 (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
その他の回答 (1)
- kmee
- ベストアンサー率55% (1857/3366)
他の言語ならできますか? それをC言語に移植することはできませんか?
お礼
ご回答ありがとうございます。
お礼
ありがとうございます、助かります。