需求:从一个在线服务器的特定URL内获得一个xml数据包,并提取其中一个节点的值。
用到的技术:socket.
用到的工具: VS2008
因为我们是客户端,所以我们只需要建立与服务器端的socket,发送请求,处理返回的包就可以了。
Q1:本人一开始不懂socket,从网上寻找到可以跨平台的socket代码,但是不知道函数调用顺序。
A1:首先要在windows下面初始化winsock,可以使用WSAStartup。然后创建socket,连接服务器和端口,接着就可以send/recv了。
Q2: 需要向某一个URL发送请求命令,但是不知get头应该如何组合。
A2:参考http://www.cnblogs.com/citygs/archive/2011/11/23/2260374.html 即可。注意get最后要有一个空行,既最后一定是\r\n\r\n.我的命令是char sendBuf[] = "GET /StableWSDiscoveryEndpoint/schemas-xmlsoap-org_ws_2005_04_discovery HTTP/1.1\r\n\r\n";
Q3: 接受数据包的时候,最后总会丢掉一部分内容。
A3:这个是我使用的socket是在同步模式。解决方法有2:1,让你的buff足够大,一次就可以完全接受完数据包的内容。2,使用异步模式的socket,可以参考http://www.cnitblog.com/guopingleee/archive/2008/09/19/49290.aspx。我这里使用的是加大我的buff,这样可以最简单最方便的处理这个问题。
跨平台socket实现: http://my.oschina.net/odison/blog/9439?from=rss
收发数据包实现:
// WinMacSocket.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "socket.h"
#include <iostream>
#include <string>
char sendBuf[] = "GET /StableWSDiscoveryEndpoint/schemas-xmlsoap-org_ws_2005_04_discovery HTTP/1.1\r\n\r\n";
char recvBuf[4096];
int _tmain(int argc, _TCHAR* argv[])
{
WSScocket socket;
if(socket.Init() == 0)
{
if (!socket.Create(AF_INET,SOCK_STREAM,IPPROTO_IP))
{
return -1;
}
if(!socket.Connect("150.245.177.13",80))
{
return -1;
}
int sendCount = socket.Send(sendBuf,sizeof(sendBuf),0);
std::string receive;
int recvBytes;
do
{
recvBytes = socket.Recv(recvBuf,sizeof(recvBuf),0);
if(recvBytes == SOCKET_ERROR || recvBytes == 0) // 0 means socket close.
{
break;
}
receive += std::string(recvBuf);
std::cout<<recvBuf<<std::endl;
} while (recvBytes > 0);
socket.Close();
socket.Clean();
}
return 0;
}
LCL_data原创于CSDN blog,转载请注明。