[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;
}