用socket来从服务器拿数据

需求:从一个在线服务器的特定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,转载请注明。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值