用socket来从服务器拿数据

来源:互联网 发布:网上寺院软件下载 编辑:程序博客网 时间:2024/05/29 02:10
需求:从一个在线服务器的特定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,转载请注明。

原创粉丝点击