码迷,mamicode.com
首页 > 编程语言 > 详细

c语言socket使用http协议访问apache服务器

时间:2015-04-10 22:09:08      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:c语言http协议

1、前言

简单理解http协议,其实就是对发送的数据进行了包装(多了表示各种属性的报头)

此链接可以学习以下编写http服务器:超轻量型http服务器 tinyhttpd

http协议报文

2、环境

本人电脑配置了apache+php的开发环境,使用80端口

3、代码

client

// ConnectToPHPServer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"  
#include	<stdio.h> 
#include	<winsock.h> 
#include	<string.h> 
#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\n");
	strcat(header,"HOST:");
	strcat(header,host);
	strcat(header,"\r\nConnection: Keep-Alive\r\n\r\n");

	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\n");
	strcat(header,"HOST:");
	strcat(header,host);
	strcat(header, "\r\nContent-Type: application/x-www-form-urlencoded\r\n");
    strcat(header, "Content-Length: 8\r\n");
	strcat(header,"Connection: Keep-Alive\r\n\r\n");
	
	strcat(header,"user=cjc\r\n\r\n");

	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!\n");
		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!\n");

	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\n",buf);*/
	buildPOSTHeader(header,SIZE,host,res);
	sendData(serverSocket,header);
	getData(serverSocket,buf,MAX_SIZE);
	printf("%s\n",buf);



	closesocket(serverSocket);
	WSACleanup();
	system("pause");
	return 0;
}

server

<?php
	if(isset($_POST['user']))
	{
		echo $_POST['user'];
	}
?>

4、结果

如果成功的话,client端dox执行窗口的末尾会输出cjc字样

c语言socket使用http协议访问apache服务器

标签:c语言http协议

原文地址:http://blog.csdn.net/cjc211322/article/details/44984635

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!