c语言实现携带XML数据HTTP请求,求指导

帅比小新 2011-10-17 10:30:28
vs2005中的c++代码,总体实现的是客户端向客户端发出httprequest,携带xml格式信息,服务端接收后返回,客户端再进行接收和解析。现在希望用c语言实现下面的代码。

CoInitialize(NULL);
CComPtr<IXMLHttpRequest> spHttp;
if (FAILED(spHttp.CoCreateInstance(__uuidof(XMLHTTPRequest))) || !spHttp)
{
return -1;
}
CString strURL;
_variant_t varp(false);
_variant_t vusername(_T(""));
_variant_t vpassword(_T(""));
BSTR bstrResponse;
strURL.Format(_T("http://%s:%d/MessageService"), pszGateWayIP, usGatePort);
spHttp->open(_bstr_t("POST"), _bstr_t(strURL), varp, vusername, vpassword);
spHttp->send(_variant_t(_bstr_t(pszReqInfo)));
spHttp->get_responseText(&bstrResponse);
strReponseHttpBody = (LPCTSTR)_bstr_t(bstrResponse);

我在网上看了些c用socket发送http请求的帖子,自己写了一段,发过去之后服务端没有反应,请高手指正一下,如果连思路都不对的话,麻烦指教下思路。

WSADATA wsaData;
int err;
SOCKET serverConnGateSock;
struct sockaddr_in serverConnGateAddr;
char msgServerRecvFromGate[MSG_SIZE];
char msg_get_original[MSG_SIZE];
char len[30];

sprintf_s(len, 30, "%d", strlen(csRndRequestXML));

sprintf_s(msg_get_original, MSG_SIZE,
"POST /MessageService HTTP/1.1\r\n"
"Accept: */*"
"Accept-Encoding: gzip, deflate"
"Host: %s:%d\r\n"
"Content-Length: %s"
"Connection: Keep-Alive"
"Cache-Control: no-cache"
"\r\n\r\n"
"%s"
, gate_ip, gate_port, len, csRndRequestXML);

err = WSAStartup(MAKEWORD(2,2), &wsaData);
if (err != 0)
{
printf("[ERROR] WSAStartup failed in SendRequest_Plain!\n");
exit(0);
}

serverConnGateSock = socket(AF_INET, SOCK_STREAM, 0);
if (serverConnGateSock == INVALID_SOCKET)
{
printf("[ERROR] socket() failed in SendRequest_Plain!\n");
WSACleanup();
return -1;
}

serverConnGateAddr.sin_family = AF_INET;
serverConnGateAddr.sin_port = htons(gate_port);
serverConnGateAddr.sin_addr.s_addr = inet_addr(gate_ip);
err = connect(serverConnGateSock, (struct sockaddr *)&serverConnGateAddr, sizeof(struct sockaddr));
if (INVALID_SOCKET == err)
{
printf("[ERROR] connect() failed in SendRequest_Plain!\n");
closesocket(serverConnGateSock);
WSACleanup();
return -2;
} else {
printf("[conn] server conn gate success\n");
}

err = send(serverConnGateSock, msg_get_original, (int)strlen(msg_get_original), 0);
if (err >= 0)
{
printf("[Success] send %d out!", err);
} else if (SOCKET_ERROR == err) {
printf("[Error] send failed!");
}

err = recv(serverConnGateSock, msg_get_original, (int)strlen(msg_get_original), 0);
if (err == SOCKET_ERROR )
{
printf("[ERROR] recv() failed in SendRequest_Plain!\n");
//closesocket(serverConnGateSock);
//WSACleanup();
//return -4;
} else if (err > 0) {
printf("[Success] recv() in SendRequest_Plain!\n\t[msgServerRecvFromGate]\n%s",msgServerRecvFromGate);
} else if (err == 0)
{
printf("[ERROR] recv() failed, connect close\n");
}
...全文
202 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅比小新 2011-10-17
  • 打赏
  • 举报
回复
顶下。
帅比小新 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luciferisnotsatan 的回复:]

send后recv不到东西?
[/Quote]
对啊,服务器那边连反应都没有。不过如果用write函数,倒是可以显示 HTTP/1.1 200 OK。不过write是在unistd.h下的吧。莫非要用fwrite函数么?又拿不到socket的FILE*指针。
帅比小新 2011-10-17
  • 打赏
  • 举报
回复
对了,具体的csRndRequestXML(发送过去请求携带的xml的信息)的内容如下:

csRequest[0] = '\0';
strcat_s(csRequest, size, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
strcat_s(csRequest, size, "<message>\r\n");
strcat_s(csRequest, size, "<head>\r\n");
strcat_s(csRequest, size, "<version>1.0</version>\r\n");
strcat_s(csRequest, size, "<serviceType>OriginalService</serviceType>\r\n");
strcat_s(csRequest, size, "</head>\r\n");
strcat_s(csRequest, size, "<body>\r\n");
strcat_s(csRequest, size, "<appId>");
strcat_s(csRequest, size, app_id);
strcat_s(csRequest, size, "</appId>\r\n");
strcat_s(csRequest, size, "</body>\r\n");
strcat_s(csRequest, size, "</message>\r\n");
luciferisnotsatan 2011-10-17
  • 打赏
  • 举报
回复
send后recv不到东西?

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧