c 언어 socket http 프로 토 콜 로 apache 서버 방문
3525 단어 socket 프로 그래 밍
http 프로 토 콜 을 간단하게 이해 하면 보 낸 데 이 터 를 포장 한 것 입 니 다(각종 속성 을 나타 내 는 헤더 가 많 습 니 다)
이 링크 는 http 서버 작성 을 배 울 수 있 습 니 다:초 경 량 형 http 서버 tiny httpd
http 프로 토 콜 메시지
2.환경
본인 컴퓨터 는 apache+phop 의 개발 환경 을 설정 하여 80 포트 를 사용 합 니 다.
3.코드
client
// ConnectToPHPServer.cpp : 。
//
#include "stdafx.h"
#include
#include
#include
#pragma comment(lib, "ws2_32.lib")
#define PORT 80
#define SIZE 512
#define MAX_SIZE 1024
void buildGETHeader(char* header, int size, char* host, char* res)
{
memset(header,0,size);
strcat(header,"GET ");
strcat(header,res);
strcat(header," HTTP/1.1\r
");
strcat(header,"HOST:");
strcat(header,host);
strcat(header,"\r
Connection: Keep-Alive\r
\r
");
return;
}
void buildPOSTHeader(char* header, int size, char* host, char* res)
{
memset(header,0,size);
strcat(header,"POST ");
strcat(header,res);
strcat(header," HTTP/1.1\r
");
strcat(header,"HOST:");
strcat(header,host);
strcat(header, "\r
Content-Type: application/x-www-form-urlencoded\r
");
strcat(header, "Content-Length: 8\r
");
strcat(header,"Connection: Keep-Alive\r
\r
");
strcat(header,"user=cjc\r
\r
");
return;
}
void sendData(SOCKET serverSocket, char* data)
{
send(serverSocket, data, strlen(data),0);
}
void getData(SOCKET serverSocket, char* data, int size)
{
int num=0;
char buf[SIZE];
memset(data,0,MAX_SIZE);
memset(buf,0,SIZE);
while(recv(serverSocket,buf,SIZE,0)>0)
{
strcat(data,buf);
memset(buf,0,SIZE);
}
return;
}
void parseURL(char*url , char*& host, char*& res)
{
char* p;
int num=0;
p=url+7;
while(*p!='/' && *p!='\0')
{
p++;
}
if(strlen(p)!=0)
{
num=strlen(p)+1;
res=(char*)malloc(num);
memset(res,0,num);
strcpy(res,p);
}
else
{
res=(char*)malloc(2);
memset(res,0,2);
res[0]='/';
}
*p='\0';
host=url+7;
return;
}
void connectToHost(char* host, SOCKET& serverSocket, char* res)
{
WSAData wsadata={0};
struct sockaddr_in addr;
struct hostent* pHost;
char header[SIZE],buf[MAX_SIZE];
if(WSAStartup(MAKEWORD(2,2),&wsadata))
{
printf("WSASartup failed!
");
system("pause");
exit(-1);
}
serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
pHost=gethostbyname(host);
addr.sin_family=AF_INET;
addr.sin_addr.S_un.S_addr=*((unsigned long*)pHost->h_addr);
addr.sin_port=htons(PORT);
connect(serverSocket,(SOCKADDR*)&addr,sizeof(addr));
printf("Connect to host OK!
");
return;
}
int main(void)
{
char url[100]="http://localhost/Workspace/FirstPHP/TestPost.php";
char *host,*res,header[SIZE],buf[MAX_SIZE];
SOCKET serverSocket;
parseURL(url,host,res);
connectToHost(host,serverSocket,res);
/*buildGETHeader(header,SIZE,host,res);
sendData(serverSocket,header);
getData(serverSocket,buf,MAX_SIZE);
printf("%s
",buf);*/
buildPOSTHeader(header,SIZE,host,res);
sendData(serverSocket,header);
getData(serverSocket,buf,MAX_SIZE);
printf("%s
",buf);
closesocket(serverSocket);
WSACleanup();
system("pause");
return 0;
}
server
4.결과
성공 하면 client 단 dox 실행 창의 끝 에 cjc 문 자 를 출력 합 니 다.