用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
= evaluate_polynomial(p1, x); double p2_val = evaluate_polynomial(p2, x); double sum_val = evaluate要接收服务器数据,你可以使用Python中的socket模块。下面是一个示例代码: ```python import socket_polynomial(sum, x); double diff_val = evaluate_polynomial(diff, x); // 显示多项式在x处的值 HOST = 'localhost' # 服务器的IP地址或域名 PORT = 8888 # 服务器的端口 printf("Polynomial 1 value at x=%.2lf: %.2lf\n", x, p1_val); printf("号 BUFFER_SIZE = 1024 # 每次接收的数据大小 # 创建一个socket对象 client_socket = socket.socket(socketPolynomial 2 value at x=%.2lf: %.2lf\n", x, p2_val); printf("Sum value at x.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect((HOST, PORT)) # 接收服务器发送的数据 while True: data = client_socket.recv(BUFFER_SIZE) if not data: break print(data.decode('utf-8')) =%.2lf: %.2lf\n", x, sum_val); printf("Difference value at x=%.2lf: %.2lf\n# 关闭socket连接 client_socket.close() ``` 在上面的示例代码中,我们创建了一个socket对象,并使用", x, diff_val); // 释放内存 free_list(p1); free_list(p2); free_listconnect()方法连接到服务器。然后,我们使用recv()方法从服务器接收数据,并在控制台打印出来(sum); free_list(diff); return 0; } ``` 输出结果为: ``` Polynomial 1: 3.。最后,我们使用close()方法关闭socket连接。 注意,这是一个简单的示例,实际使用中需要考虑更多的细节和异常处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值