#include #include #include #include #include #include #include typedef struct _ConnectHost_t { char server_name[256]; /* connect server */ char port_name[128]; /* connect port */ char method[64]; /* "GET" / "POST" string */ char proxy_name[128]; /* proxy name */ long proxy_port; /* proxy port */ char url[256]; /* get url */ char data[65536]; /* data */ } ConnectHost_t; #define HTTP_GET_HEAD1 "%s %s%s%s HTTP/1.0\n" #define HTTP_GET_HEAD2 "Content-type: application/x-www-form-urlencoded\n" #define HTTP_GET_HEAD3 "Content-length: %d\n\n" #define HTTP_GET_GET "GET" #define HTTP_GET_POST "POST" #define HTTP_GET_ERR_NOT_HOST (-100) #define HTTP_GET_ERR_NOT_PORT (-101) #define HTTP_GET_ERR_CREATE (-102) #define HTTP_GET_ERR_CONNECT (-103) #define HTTP_GET_ERR_RECV_SOCKET (-104) int HTTP_GET_HEAD_CREATE(ConnectHost_t *host, int i_len, char **data) { char work1[2048]; char work2[2048]; char head[2048]; /* データ領域の確保 */ memset(work1, 0, sizeof(work1)); memset(work2, 0, sizeof(work2)); memset(head, 0, sizeof(head)); /* proxy経由 */ if (strlen(host->proxy_name)) { sprintf(work1, "http://%s", host->server_name); } else { sprintf(work1, "%s", host->url); } /* GET/POST */ if ( strcmp(host->method, HTTP_GET_POST) == 0) { /* メソッド */ sprintf( work2, HTTP_GET_HEAD1, host->method, work1, "", host->url ); /* コンテンツ部の長さ編集 */ sprintf(work1, HTTP_GET_HEAD3, i_len); /* ヘッダ部の作成 */ sprintf( head, "%s%s%s", work2, HTTP_GET_HEAD2, work1); /* データ部の設定 */ *data = (char *)malloc(strlen(head) + i_len + 1); strcpy( *data, head ); strcat( *data, host->data ); } else { /* メソッド + コンテンツ部の長さ編集 */ sprintf( work2, HTTP_GET_HEAD1, host->method, work1, host->data, "" ); /* データ部の設定 */ *data = (char *)malloc(strlen(head) + 1000 + 1); strcpy( *data, work2 ); strcat( *data, "\n" ); } return 0; } int http_get(ConnectHost_t *host, char *buf, int *len, int *err) { int sock_fd; struct hostent *host_inf; struct servent *cserv; struct sockaddr_in paddr; char rev_buf[65535]; fd_set fdRead, fdWrite; struct timeval timeOutCtrl; int ret; char *head; /* init */ memset( (char *)&paddr, 0, sizeof(paddr)); /* connect host address & port serch */ if (strlen(host->proxy_name)) { /* host address */ if ((host_inf = gethostbyname(host->proxy_name)) == NULL) { *err = errno; return HTTP_GET_ERR_NOT_HOST; } /* port */ paddr.sin_port = ntohs(host->proxy_port); } else { /* host address */ if ((host_inf = gethostbyname(host->server_name)) == NULL) { *err = errno; return HTTP_GET_ERR_NOT_HOST; } /* port */ if ((cserv = getservbyname(host->port_name, "tcp")) == NULL) { *err = errno; return HTTP_GET_ERR_NOT_PORT; } /* port */ paddr.sin_port = cserv->s_port; } /* connect server info */ paddr.sin_family = AF_INET; memcpy(&paddr.sin_addr.s_addr, host_inf->h_addr, host_inf->h_length); /* socket create */ if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { *err = errno; return HTTP_GET_ERR_CREATE; } /* connect server */ ret = connect(sock_fd, (struct sockaddr *)&(paddr), sizeof(paddr)); if ( ret == -1 ) { *err = errno; return HTTP_GET_ERR_CONNECT; } /* header */ if (strlen(host->proxy_name)) { sprintf(rev_buf, "GET http://www.cs-n.co.jp/ HTTP/1.0\n\n"); } else { strcat(rev_buf, host->method); strcat(rev_buf, " /cgi-bin/xyz.cgi HTTP/1.0\n\n"); } HTTP_GET_HEAD_CREATE(host, 7, &head); printf("head = \n%s\n", head); /* data send */ send(sock_fd, head, strlen(head), 0); printf("send OK!\n"); /* select */ FD_ZERO(&fdRead); FD_SET(sock_fd, &fdRead); FD_ZERO(&fdWrite); FD_SET(sock_fd, &fdWrite); timeOutCtrl.tv_sec = 0; timeOutCtrl.tv_usec = 500000; /* 0.5秒 */ ret = select(sock_fd + 1, &fdRead, &fdWrite, NULL, &timeOutCtrl); printf("ret = %d\n", ret ); printf("FD_ISSET read = %d\n", FD_ISSET(sock_fd, &fdRead) ); printf("FD_ISSET write = %d\n", FD_ISSET(sock_fd, &fdWrite) ); /* */ if (ret == 0 || ret == -1) { close(sock_fd); return( HTTP_GET_ERR_RECV_SOCKET ); } if ((FD_ISSET(sock_fd, &fdRead) || FD_ISSET(sock_fd, &fdWrite) == 0) || (FD_ISSET(sock_fd, &fdRead) == 0 && FD_ISSET(sock_fd, &fdWrite) == 0)) { close(sock_fd); return( HTTP_GET_ERR_RECV_SOCKET ); } /* data recv */ recv(sock_fd, buf, 65535, 0); printf("recv OK!\n"); printf("buf = \n%s", buf); close(sock_fd); return 0; } main() { ConnectHost_t host; char buf[65536]; int len; int err; int ret; /* init */ memset(&host, 0, sizeof(host)); memset(buf, 0, sizeof(buf)); /* proxy */ #if 1 strcpy(host.proxy_name, "proxy.xxx.co.jp"); host.proxy_port = 8080; strcpy(host.server_name, "www.sea-bird.org/"); strcpy(host.url, "/index.html"); strcpy(host.method, "GET"); strcpy(host.data, ""); #else strcpy(host.server_name, "10.75.83.40"); strcpy(host.port_name, "www"); strcpy(host.url, "/index.html"); strcpy(host.method, "GET"); strcpy(host.data, ""); #endif ret = http_get(&host, buf, &len, &err); printf("http_get_init =%d\n", ret); }