コード:
#include <stdio.h>
#include <winsock2.h>
#include "lib/BREGEXP.H"
#include "lib/crypto.h"
#include "lib/ssl.h"
#include "lib/err.h"
#include "lib/rand.h"
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"lib/BREGEXP.LIB")
#pragma comment(lib,"lib/libeay32.lib")
#pragma comment(lib,"lib/ssleay32.lib")
void _tcp_client(char *,char *);
int main()
{
WSADATA wsaData;
SOCKET sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
SOCKET sock;
BOOL yes = 1;
char inbuf[20480];
char *buf_data = "\0";
char out[20480];
int client_flag = 0;
WSAStartup(MAKEWORD(2,0), &wsaData);
sock0 = socket(AF_INET, SOCK_STREAM, 0);
if(sock0 == INVALID_SOCKET)
{
printf("socket : %d\n", WSAGetLastError());
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(57630);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
setsockopt(sock0,SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes));
if(bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0)
{
printf("bind : %d\n", WSAGetLastError());
return 1;
}
if(listen(sock0, 5) != 0)
{
printf("listen : %d\n", WSAGetLastError());
return 1;
}
while(1)
{
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
if(sock == INVALID_SOCKET)
{
printf("accept : %d\n", WSAGetLastError());
break;
}
memset(inbuf, 0, sizeof(inbuf));
recv(sock, inbuf, sizeof(inbuf), 0);
printf("端末からリクエストを受け取りました。\n\n"
"-------------------------------------\n");
memset(out, 0, sizeof(out));
_tcp_client(inbuf,out);
send(sock,out,(int)strlen(out),0);
printf("端末へレスポンスを返しました。\n\n"
"-------------------------------------\n");
closesocket(sock);
}
WSACleanup();
return 0;
}
void _tcp_client(char *buf,char *out_buf)
{
SSL *ssl;
SSL_CTX *ctx;
WSADATA wsaData;
SOCKET sock1;
char r_buf[20480];
unsigned int **addrptr;
struct sockaddr_in server;
struct hostent *host;
int n = 0;
BREGEXP *rxp = NULL;
char *send_buf = buf;
char msg[80];
char patern1[] = "m/Host: (.*)\\r\\n/i";
char patern2[] = "s/(GET|POST) http:\\/\\/(.+?)(\\/.*)/$1 $3/g";
int ctr;
int pos = 0;
int i = 0;
int ret;
char server_host[1024];
char *send_host = NULL;
//////////////////////////////////////////////////
// //
// 接続先Hostの取得(正規表現) //
// //
//////////////////////////////////////////////////
memset(server_host,0,sizeof(server_host));
BMatch(patern1,buf+pos,buf+strlen(buf),&rxp,msg);
ret = rxp->endp[1] - rxp->startp[1];
for(i=0; i<ret; i++)
{
server_host[i] = rxp->startp[1][i];
}
i++;
server_host[i] = '\0';
BRegfree(rxp);
//////////////////////////////////////////////////
// //
// クエストヘッダーの編集(正規表現) //
// //
//////////////////////////////////////////////////
rxp = NULL;
ctr = BSubst(patern2,send_buf,send_buf+lstrlen(send_buf),&rxp,msg);
memset(send_buf,0,sizeof(send_buf));
sprintf(send_buf,"%s",rxp->outp);
BRegfree(rxp);
//////////////////////////////////////////////////
// //
// サーバー接続(ソケット開始) //
// //
//////////////////////////////////////////////////
if(WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
{
printf("ERROR '1' code -> ");
printf("%d",WSAGetLastError());
return;
}
sock1 = socket(AF_INET,SOCK_STREAM,0);
if(sock1 == INVALID_SOCKET)
{
printf("ERROR '2' code -> ");
printf("%d",WSAGetLastError());
return;
}
server.sin_family = AF_INET;
server.sin_port = htons(80);
server.sin_addr.S_un.S_addr = inet_addr(server_host);
host = gethostbyname(server_host);
if(host == NULL)
{
if(WSAGetLastError() == WSAHOST_NOT_FOUND)
{
printf("ERROR '3' code -> ");
printf("%d",WSAGetLastError());
return;
}
printf("ERROR '4' code -> ");
printf("%d",WSAGetLastError());
return;
}
addrptr = (unsigned int **)host->h_addr_list;
server.sin_addr.S_un.S_addr = *(*addrptr);
if(connect(sock1,(struct sockaddr *)&server,sizeof(server)) == -1)
{
printf("ERROR '5' code -> \n");
printf("%d",WSAGetLastError());
return;
}
printf("Webサーバーへ接続しました。\n"
"Host -> %s\n\n"
"-------------------------------------\n",server_host);
n = send(sock1,send_buf,(int)strlen(send_buf),0);
printf("リクエストを送信しました。\n\n"
"%s"
"-------------------------------------\n",send_buf);
while(n > 0)
{
memset(r_buf,0,sizeof(r_buf));
n = recv(sock1,r_buf,sizeof(r_buf),0);
sprintf(out_buf,"%s%s",out_buf,r_buf);
}
sprintf(out_buf,"%s\0",out_buf);
printf("Webサーバーからレスポンスを取得しました。\n\n"
"%s\n"
"-------------------------------------\n",out_buf);
closesocket(sock1);
WSACleanup();
}