自动选择速度最好的服务器

raymonzhao 2007-06-21 01:09:18
现系统的通信有SOAP和SOCKET两种方式,寻自动选择服务器的方案.
直接检测SOAP响应时间或SOCKET建立连接的时间?还是用PING一下就好了?
...全文
633 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
MLiang 2007-07-05
  • 打赏
  • 举报
回复
PING 就是发了一个ICMP的包,网上很多实现 好像 vckbase上就有,或者你看下 TCP/IP详解 卷一 ICMP那一章
raymonzhao 2007-07-05
  • 打赏
  • 举报
回复
谢谢大家的帮助,可能还是有些问题的,等我整理一下再来讨论一下.
danscort2000 2007-06-27
  • 打赏
  • 举报
回复
额外增加一个UDP服务器,光PING是不行的,因为某些网关或者ROUTER会杀掉PING包
监控每台服务器的在线数量,传递给UDP服务器,
而UDP服务器每接收到一个请求
就发送在线连接最少的那台服务器地址或者标志过去
Y___Y 2007-06-27
  • 打赏
  • 举报
回复
ping的源码 在著名的Network Programming for Microsoft Windows 2nd上有
原始套接字搞的
Ping example performs the following steps.

1.Creates a socket of address family AF_INET, type SOCK_RAW, and protocol IPPROTO_ICMP. For IPv6, the address family is AF_INET6, type SOCK_RAW, and protocol value 58.

2.Creates and initializes the ICMP header.

3.Calls sendto or WSASendTo to send the ICMP request to the remote host.

4.Calls recvfrom or WSARecvFrom to receive any ICMP responses.
// Define the ICMP header
typedef struct icmp_hdr
{
unsigned char icmp_type;
unsigned char icmp_code;
unsigned short icmp_checksum;
unsigned short icmp_id;
unsigned short icmp_sequence;
unsigned long icmp_timestamp;
} ICMP_HDR, *PICMP_HDR, FAR *LPICMP_HDR;

ICMP_HDR *icmp=NULL;
SOCKET s;
SOCKADDR_STORAGE dest;
char buf[sizeof(ICMP_HDR) + 32];

icmp = (ICMP_HDR *)buf;
icmp->icmp_type = 8; // echo request type
icmp->icmp_code = 0;
icmp->icmp_id = GetCurrentProcessId();
icmp->icmp_checksum = 0; // zero field before computing checksum
icmp->icmp_sequence = 0;
icmp->icmp_timestamp = GetTickCount();
// Fill in the payload with a random character
memset(&buf[sizeof(ICMP_HDR)], '@', 32);
// Compute the checksum over the ICMP header and payload
// The checksum() function computes the 16-bit one's
// complement on the specified buffer. See the Ping
// code sample on the companion CD for its implementation.
icmp->icmp_checksum = checksum(buf, sizeof(ICMP_HDR)+32);

s = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

// Initialize the destination SOCKADDR_STORAGE
((SOCKADDR_IN *)&dest)->sin_family = AF_INET;
((SOCKADDR_IN *)&dest)->sin_port = htons(0);
// port is ignored for ICMP
((SOCKADDR_IN *)&dest)->sin_addr.s_addr = inet_addr("1.2.3.4");

sendto(s, buf, sizeof(ICMP_HDR)+32, 0, (SOCKADDR *)&dest,
sizeof(dest));

nizhaorong 2007-06-27
  • 打赏
  • 举报
回复
多台服务器,一台全局服务器,依次登录,从快到慢,可否?
Hylas 2007-06-26
  • 打赏
  • 举报
回复
解决方法
1 数据库
2 用其中一台机做全局服务器
taianmonkey 2007-06-26
  • 打赏
  • 举报
回复
Program Files\Microsoft SDK\Samples\netds\WinSock\Ping
fantiyu 2007-06-25
  • 打赏
  • 举报
回复
不明白你需要保证什么样的数据同步, 服务器间同步方法有很多的



-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
raymonzhao 2007-06-25
  • 打赏
  • 举报
回复
选择速度最快的服务器大致可以实现,但如何保持各服务器的相关数据的同步呢?(比如用户的一些订制信息),如果一切都理想的化,应该不会出现什么问题.但如果其中某一台服务器挂掉了,或者某两台服务器间的通信不畅,这个有什么好的方案解决没.
raymonzhao 2007-06-22
  • 打赏
  • 举报
回复
先谢谢各位了.我去找下看.呵.
大家还有其家的建议的话也可以说说看啊.
DentistryDoctor 2007-06-21
  • 打赏
  • 举报
回复
Platform SDK的Sample目录中有Ping的源代码。
fantiyu 2007-06-21
  • 打赏
  • 举报
回复
很久以前用VC6写过ping程序,lz如果需要可以加群找我要这东西



-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
raymonzhao 2007-06-21
  • 打赏
  • 举报
回复
楼上,有ping的源码没?或者如何调用ping?
Hylas 2007-06-21
  • 打赏
  • 举报
回复
soap 是建立在 socket之上的应用, 所以两个的网络速度是一样的。

soap 因为比socket 层次高, 所有封装更多的通信数据,
如果同时有两个接口 那就用socket好的;

不同的服务器 先ping 一下 确定哪个响应快; 当然还要考虑服务器 事务层的处理能力

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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