重工电子论坛

标题: HTTP POST 方法的C测试程序 [打印本页]

作者: 李维强-15级    时间: 2016-1-23 21:57
标题: HTTP POST 方法的C测试程序
[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的方法:








欢迎光临 重工电子论坛 (http://cqutlab.cn/) Powered by Discuz! X3.1