重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5600|回复: 0
打印 上一主题 下一主题

[分享] HTTP POST 方法的C测试程序

[复制链接]

287

主题

668

帖子

5636

积分

学生管理组

Rank: 8Rank: 8

积分
5636
跳转到指定楼层
楼主
发表于 2016-1-23 21:57:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
/*
HTTP POST测试程序
程序的初衷是做GPS设备,让设备访问我网站的webservice,把GPS信息发送到我.net架构的网站上来,结果用人家的工具和测试一直没成功
听取团队成员袁庭飞的意见后,自己写个来测试,并且成功返回。
*/
#define _WINSOCK_DEPRECATED_NO_WARNINGS			//这里为了用老函数  新不然inet_addr这种函数都要换成微软的新的,懒得换了。
#include "stdio.h"
#include "stdlib.h"
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{

	SOCKET hsocket;
	SOCKADDR_IN saServer;
	WSADATA     wsadata;
	LPHOSTENT lphostent;
	int     nRet;
	char*   host_name = "www.sina.com";	//这是域名		//但这里我使用本机IP,125.83.116.37  
														//以下是我构造的POST的数据包
	char*   reqHead = "POST /WebService1.asmx/HelloWorld HTTP/1.1\r\n"   //此为要发送的数据包  
		"Host: 125.83.116.37\r\n"
		"Content-Type: application/x-www-form-urlencoded\r\n"
		"Content-Length: 0\r\n\r\n";


	// 初始化套接字 
	if (WSAStartup(MAKEWORD(2, 2), &wsadata))
	{
		printf("初始化SOCKET出错!\r\n");
	}
		
	lphostent = gethostbyname(host_name);	//这一句就是连接网络,获取域名解析
	if (lphostent == NULL)
	{
		printf("lphostent为空!\r\n");		//那个域名行不通的话 这里就会报错
	}
	else
	{
		printf("测试域名%s已经解析正常\r\n",host_name);
	}
		
	hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	saServer.sin_family = AF_INET;
	saServer.sin_port = htons(80);
	//saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);   //这是用域名方式
	//inet_ntoa(*(in_addr*)*(gethostbyname(host_name)->h_addr_list));	//这个网上找的 没研究,也是用域名方式。
	saServer.sin_addr.s_addr = inet_addr("125.83.116.37");			//用IP方式
	// 利用SOCKET连接  
	nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
	if (nRet == SOCKET_ERROR)
	{
		printf("建立连接时出错!\r\n");
		closesocket(hsocket);
		return 0;
	}
	// 利用SOCKET发送  

	nRet = send(hsocket, reqHead, strlen(reqHead), 0);
	if (nRet == SOCKET_ERROR)
	{
		printf("发送数据包时出错!\r\n");
		closesocket(hsocket);
	}
	printf("正常连接\r\n");
	Sleep(1000);
	char   Dest[3000];
	nRet = 1;
	while (nRet>0)
	{
		// 接收返回数据包  
		nRet = recv(hsocket, (LPSTR)Dest, sizeof(Dest), 0);			//这个函数是阻塞模式下的 send也是,要用其他函数把socket转成非阻塞,但是要多次收
																	//但是要多次收才行。
		if (nRet>0)
			Dest[nRet] = 0;
		else
			Dest[0] = 0;
		// 显示返回数据包的大小、内容 
		printf("\nReceived   bytes:%d\n", nRet);
		printf("Result:\n%s", Dest);
	}
	system("pause");
	return 0;
}

结果为:


另外付我webservice的方法:



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-4-29 12:36 , Processed in 0.179807 second(s), 31 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表