当前位置:文档之家› iperf使用总结与源码分析

iperf使用总结与源码分析

iperf使用总结与源码分析
iperf使用总结与源码分析

iperf 使用总结

Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;从而能够帮助我们测试网络性能,定位网络瓶颈。

参数说明

-s 以server模式启动,eg:iperf -s

-c 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23

通用参数

-f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单

位,eg:iperf -c 222.35.11.23 -f K

-i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2

iperf是client端向server端发送数据

server端显示的是接收速率,最好加i参数,进行速率跟踪

client 显示的是发送速率

server 显示接收速率

-l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16

可以使用不同的包长,进行测试

-m 显示tcp最大mtu值

-o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:/iperflog.txt

-p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999

-u 使用udp协议

测试htb的时候最好用udp,udp通信开销小,测试的带宽更准确

-w 指定TCP窗口大小,默认是8KB

如果窗口太小,有可能丢包

-B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数)

-C 兼容旧版本(当server端和client端版本不一样时使用)

-M 设定TCP数据包的最大mtu值

-N 设定TCP不延时

-V 传输ipv6数据包

server专用参数

-D 以服务方式运行ipserf,eg:iperf -s -D

-R 停止iperf服务,针对-D,eg:iperf -s -R

client端专用参数

-d 同时进行双向传输测试

-n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000

-r 单独进行双向传输测试

-b 指定发送带宽,默认是1Mbit/s

在测试qos的时候,这是最有用的参数。

-t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5

默认是10s

-F 指定需要传输的文件

-T 指定ttl值

Iperf 源代码分析(一)

概述

前段时间学习Linux网络编程的有关知识,希望看一看这些网络编程的技术在实际的代码中是如何运用的。正巧实验室的项目中使用了开源网络性能测试软件Iperf,于是便初步分析了Iperf 的源代码。现将分析代码的点滴收获写在我的Blog上,希望各位高人多多指教。

Iperf 是美国伊利诺斯大学(University of Illinois)开发的一种网络性能测试工具。可以用来测试网络节点间TCP或UDP连接的性能,包括带宽、延时抖动(jitter,适用于UDP)以及误码率(适用于UDP)等。关于Iperf的下载、安装以及详细的使用方法,可以参照:

https://www.doczj.com/doc/c44661702.html,/Projects/Iperf/

Iperf是按照Server-Client范型工作的。在连接的一端使用以下命令启动Server:

iperf -s

在连接的另一端启动Client:

iperf -c 1.1.1.1

此处假设Server端的IP地址为1.1.1.1。经过一段测试时间(默认为10秒),在Server端和Client端就会打印出网络连接的各种性能参数。Iperf作为一种功能完备的测试工具,还提供了各种选项,例如是建立TCP连接还是UDP连接、测试时间、测试应传输的字节总数、测试模式等。而测试模式又分为单项测试(Normal Test)、同时双向测试(Dual Test)和交替双向测试(Tradeoff Test)。此外,用户可以指定测试的线程数。这些线程各自独立的完成测试,并可报告各自的以及汇总的统计数据。对于Iperf的详细使用方法以及命令行参数的意义,请参照上面的网页。

Iperf是用C++语言实现的,对设计中的各种结构和功能单元都按照面向对象的思想进行建模。

它主要用到了 Unix系统编程中两个主要的部分:Socket网络编程和多线程编程。因此,通过

分析Iperf的源代码,我们就可以在实际的例子中学习面向对象编程, Socket网络编程以及多

线程编程的技术。同时,Iperf实现的功能比较简单,代码并不复杂,而且功能比较单一。因此,Iperf是我们研究Unix 系统编程技术的一个很好的学习对象。

我所分析的是Iperf 1.7.0版的源代码。需要说明的是,Iperf的源代码中既包含了对应于Unix

的部分,也包含了对应于Windows的部分。这两部分是通过条件编译的预处理语句分别编译的。我仅对Unix部分的代码进行分析。

Iperf提供的库

在开发Iperf的过程中,开发者把 Socket编程和多线程编程中经常用到的一些系统调用封装成

对象,屏蔽了底层函数的复杂接口,提供了模块化和面向对象的机制,也为我们提供了一些非

常实用的编程工具,我们可以在实现自己的程序时复用这些类。由于这些类实现的源代码都比

较简单,也为我们修改前人的代码实现自己的功能提供了方便。

这些类的定义与实现都在源代码文件夹的lib子文件夹下。主要包括以下一些对象:SocketAddr类:封装了Socket接口中的网络地址结构(sockaddr_in等)以及各种地址转换

的系统调用(gethostbyname、gethostbyaddr、inet_ntop等);

Socket类:封装了socket文件描述符,以及socket、listen、connect等系统调用;

Mutex类以及Condition类:封装了POSIX标准中的mutex和condition(条件变量)线程同

步机制;

Thread类:封装了POSIX标准中的多线程机制,提供了一种简单易用的线程模型;Timestamp类:通过Unix系统调用gettimeofday实现了一个时间戳对象,提供了获得当前时

间戳,计算两个时间戳之间的先后关系等方法。

此外,在lib文件夹中还包括一些Iperf的实现提供的实用工具函数,包括endian.c文件中的字

节序转换函数、gnu_getopt文件中的命令行参数处理函数、snprintf文件中的字符串格式化函数、signal.c文件中的与信号处理有关的函数、 string.c文件中的字符处理函数、

tcp_window_size.c文件中的TCP窗口大小处理函数等。

接下来对lib文件夹中的一些比较重要的类和函数进行说明。

Iperf 源代码分析(二)

Thread类

Thread类封装了POSIX标准中的多线程机制,提供了一种简单易用的线程模型。Thread类是Iperf的实现中比较重要的类,使Iperf实现多线程并行操作的核心。

Thread类的定义在文件lib/Thread.hpp中,其实现位于lib/Thread.cpp中。

/* ------------------------------------------------------------------- */

class Thread {

public:

Thread( void );

virtual ~Thread();

// start or stop a thread executing

void Start( void );

void Stop( void );

// run is the main loop for this thread

// usually this is called by Start(), but may be called

// directly for single-threaded applications.

virtual void Run( void ) = 0;

// wait for this or all threads to complete

void Join( void );

static void Joinall( void );

void DeleteSelfAfterRun( void ) {

mDeleteSelf = true;

}

// set a thread to be daemon, so joinall won't wait on it

void SetDaemon( void );

// returns the number of user (i.e. not daemon) threads

static int NumUserThreads( void ) {

return sNum;

}

static nthread_t GetID( void );

static bool EqualID( nthread_t inLeft, nthread_t inRight );

static nthread_t ZeroID( void );

protected:

nthread_t mTID;

bool mDeleteSelf;

// count of threads; used in joinall

static int sNum;

static Condition sNum_cond;

private:

// low level function which calls Run() for the object

// this must be static in order to work with pthread_create

static void* Run_Wrapper( void* paramPtr );

}; // end class Thread

数据成员说明:

mTID纪录本线程的线程ID;

mDeleteSelf通过方法DeleteSelfAfterRun设置,用来说明是否在线程结束后释放属于该现程的变量;

sNum是一个静态变量,即为所有的Thread实例所共有的。该变量纪录所生成的线程的总数。Thread对象的Joinall方法通过该变量判断所有的Thread实例是否执行结束;

sNum_cond是用来同步对sNum的操作的条件变量,也是一个静态变量。

主要函数成员说明:

Start方法:

/* -------------------------------------------------------------------

* Start the object's thread execution. Increments thread

* count, spawns new thread, and stores thread ID.

* ------------------------------------------------------------------- */

void Thread::Start( void ) {

if ( EqualID( mTID, ZeroID() ) ) {

// increment thread count

sNum_cond.Lock();

sNum++;

sNum_cond.Unlock();

Thread* ptr = this;

// pthreads -- spawn new thread

int err = pthread_create( &mTID, NULL, Run_Wrapper, ptr );

FAIL( err != 0, "pthread_create" );

}

} // end Start

首先通过Num++纪录一个新的线程的产生,之后通过pthread_create系统调

用产生一个新的线程。新线程执行Run_Wrapper函数,以至向该Thread实例

的ptr指针作为参数。原线程在判断pthread_create是否成功后退出Start函数。

Stop方法:

/* -------------------------------------------------------------------

* Stop the thread immediately. Decrements thread count and

* resets the thread ID.

* ------------------------------------------------------------------- */

void Thread::Stop( void ) {

if ( ! EqualID( mTID, ZeroID() ) ) {

// decrement thread count

sNum_cond.Lock();

sNum--;

sNum_cond.Signal();

sNum_cond.Unlock();

nthread_t oldTID = mTID;

mTID = ZeroID();

// exit thread

// use exit() if called from within this thread

// use cancel() if called from a different thread

if ( EqualID( pthread_self(), oldTID ) ) {

pthread_exit( NULL );

} else {

// Cray J90 doesn't have pthread_cancel; Iperf works okay without

pthread_cancel( oldTID );

}

}

} // end Stop

首先通过sNum--纪录一个线程执行结束,并通过sNum_cond的Signal方法激活此时wait在 sNum_cond的线程(某个主线程会调用调用Joinall方法,等待

全部线程的结束,在Joinall方法中通过sNum_cond.Wait() 等待在

sNum_cond条件变量上)。若结束的线程是自身,则调用pthread_exit函数结束,否则调用pthread_cancel函数。注意:传统的exit函数会结束整个进程(即该进程的全部线程)的运行,而pthread_exit函数仅结束该线程的运行。

Run_Wrapper方法:

/* -------------------------------------------------------------------

* Low level function which starts a new thread, called by

* Start(). The argument should be a pointer to a Thread object.

* Calls the virtual Run() function for that object.

* Upon completing, decrements thread count and resets thread ID.

* If the object is deallocated immediately after calling Start(),

* such as an object created on the stack that has since gone

* out-of-scope, this will obviously fail.

* [static]

* ------------------------------------------------------------------- */

void*

Thread::Run_Wrapper( void* paramPtr ) {

assert( paramPtr != NULL );

Thread* objectPtr = (Thread*) paramPtr;

// run (pure virtual function)

objectPtr->Run();

#ifdef HAVE_POSIX_THREAD

// detach Thread. If someone already joined it will not do anything

// If noone has then it will free resources upon return from this

// function (Run_Wrapper)

pthread_detach(objectPtr->mTID);

#endif

// set TID to zero, then delete it

// the zero TID causes Stop() in the destructor not to do anything

objectPtr->mTID = ZeroID();

if ( objectPtr->mDeleteSelf ) {

DELETE_PTR( objectPtr );

}

// decrement thread count and send condition signal

// do this after the object is destroyed, otherwise NT complains

sNum_cond.Lock();

sNum--;

sNum_cond.Signal();

sNum_cond.Unlock();

return NULL;

} // end run_wrapper

该方法是一个外包函数(wrapper),其主要功能是调用本实例的Run方法。

实际上, Run_Wrapper是一个静态成员函数,是为所有的Thread实例所共有的,因此无法使用this指针。调用Run_Wrapper的Thread 是通过参数paramPtr指明具体的Thread实例的。在Run返回之后,通过pthread_detach 使该线程在运行结束以后可以释放资源。 Joinall函数是通过监视sNum的数值

等待所有线程运行结束的,而并非通过pthread_join函数。在完成清理工作后,Run_Wrapper减少sNum的值,并通过sNum_cond.Signal函数通知在Joinall

中等待的线程。

Run方法:

从Run方法的声明中知道,该方法是一个纯虚函数,因此Thread是一个抽象

基类,主要作用是为其派生类提供统一的对外接口。在Thread的派生类中,

像Iperf中的Server,Client,Speader,Audience, Listener等类,都会为

Run提供特定的实现,完成不同的功能,这是对面向对象设计多态特性的运用。Thread函数通过Run方法提供了一个通用的线程接口。

讨论:为什么要通过Run_Wrapper函数间接的调用Run函数?

首先,Thread的各派生类的完成的功能不同,但它们都是Thread的实例,都

有一些相同的工作要做,如初始化和清理等。在Run_Wrapper中实现这些作

为Thread实例所应有的相同功能,在Run函数中实现派生类各自不同的功能,是比较合理的设计。

更重要的是,由于要通过Pthread_create函数调用Run_Wrapper函数,因此Run_Wrapper函数必须是一个静态成员,无法使用this指针区分运行

Run_Wrapper函数的具体实例,也就无法利用多态的特性。而这个问题可以通

过把this指针作为Run_Wrapper函数的参数,并在Run_Wrapper中显示调用

具有多态特性的Run函数来解决。

这种使用一个wrapper函数的技术为我们提供了一种将C++面向对象编程和传

统的Unix系统调用相结合的思路。

Joinall方法和SetDaemon方法:

/* -------------------------------------------------------------------

* Wait for all thread object's execution to complete. Depends on the

* thread count being accurate and the threads sending a condition

* signal when they terminate.

* [static]

* ------------------------------------------------------------------- */

void Thread::Joinall( void ) {

sNum_cond.Lock();

while ( sNum > 0 ) {

sNum_cond.Wait();

}

sNum_cond.Unlock();

} // end Joinall

/* -------------------------------------------------------------------

* set a thread to be daemon, so joinall won't wait on it

* this simply decrements the thread count that joinall uses,

* which is not a thorough solution, but works for the moment

* ------------------------------------------------------------------- */

void Thread::SetDaemon( void ) {

sNum_cond.Lock();

sNum--;

sNum_cond.Signal();

sNum_cond.Unlock();

}

由这两个方法的实现可见,Thread类是通过计数器sNum监视运行的线程数的。线程开始前(Start方法中的pthread_create)sNum加一,线程结束后(Stop

方法和Run_Wrapper方法末尾)sNum减一。Joinall通过条件变量类的实例sNum_cond的Wait方法等待sNum的值改变。而SetDaemon的目的是使调

用线程不再受主线程Joinall的约束,只是简单的把sNum减一就可以了。

Iperf 源代码分析(三)

SocketAddr类

SocketAddr类定义在lib/SocketAddr.hpp中,实现在lib/SocketAddr.cpp中。SocketAddr

类封装了网络通信中经常用到的地址结构以及在这些结构上进行的操作。地址解析也是在SocketAddr的成员函数中完成的。

首先讨论一下Socket编程中用于表示网络地址的数据结构。

网络通信中的端点地址可以一般化的表示为(地址族,该族中的端点地址)。Socket接

口系统中用来表示通用的网络地址的数据结构是sockaddr:

struct sockaddr { /* struct to hold an address */

u_char sa_len /* total length */

u_short sa_family; /* type of address */

char sa_data[14]; /* value of address */

};

其中sa_family表示地址所属的地址族,TCP/IP协议的地址族用常量AF_INET表示,而UNIX命名管道的地址族用常量AF_UNIX表示。

使用Socket的每个协议族都精确定义了自己的网络端点地址,并在头文件中提供了相应的结构声明。用来表示TCP/IP地址的数据结构如下:

struct sockaddr_in {

u_char sin_len; /* total length */

u_short sin_family; /* type of address */

u_short sin_port; /* protocol port number */

struct in_addr sin_addr; /* IP address */

char sin_zero[8]; /* unused (set to zero) */

}

其中,sin_len和sin_family和sockaddr机构中的sa_len以及sa_family表示相同的数据。结构sockaddr_in将 sockaddr中通用的端点地址sa_data(14字节长)针对TCP/IP的地

址结构作了细化,分为8bit的端口地址sin_port和 32bit的IP地址。在Linux系统中,结

构in_addr如下定义:

struct in_addr {

unsigned long s_addr; /* IP address */

}

可见,结构in_addr仅有一个成员,表示一个32bit的数据,即IP地址。对于通用地址结构中的其余bit,填充0。

Socket接口中的很多函数都是为通用的网络地址结构设计的,例如,我们既可以用bind 函数将一个socket绑定到一个TCP/IP的端口上,也可以用bind函数将一个socket绑定到一个UNIX命名管道上。因此,像bind, connect, recvfrom, sendto等函数都要求一个sockaddr结构作为指名地址的参数。这时,我们就要使用强制类型转换把表示IP地址的sockaddr_in结构转换为sockaddr结构进行函数调用。但实际上,sockaddr和sockaddr_in 结构表示的均是同一地址。它们在内存中对应的区域是重合的。

SockedAddr类的功能比较单一,成员变量mAddress就是SocketAddr的实例所表示的TCP/IP端口地址(包括IP地址和 TCP/UDP端口号)。类声明mAddress为

iperf_sockaddr类型的变量,而在文件/lib/headers.h中,有

typedef sockaddr_in iperf_sockaddr

因此,iperf_sockaddr实际上就是sockaddr_in类型的变量。SockedAddr的成员函数都是对mAddress进行读取或修改的操作的。比较复杂的成员函数是setHostname,它完成了地址解析的过程,源代码如下(已将不相关部分删除)。

/* -------------------------------------------------------------------

* Resolve the hostname address and fill it in.

* ------------------------------------------------------------------- */

void SocketAddr::setHostname( const char* inHostname ) {

assert( inHostname != NULL );

mIsIPv6 = false;

mAddress.sin_family = AF_INET;

// first try just converting dotted decimal

// on Windows gethostbyname doesn't understand dotted decimal

int rc = inet_pton( AF_INET, inHostname, (unsigned char*)&(mAddress.sin_addr) );

if ( rc == 0 ) {

struct hostent *hostP = gethostbyname( inHostname );

if ( hostP == NULL ) {

/* this is the same as herror() but works on more systems */ const char* format;

switch ( h_errno ) {

case HOST_NOT_FOUND:

format = "%s: Unknown host/n";

break;

case NO_ADDRESS:

format = "%s: No address associated with name/n";

break;

case NO_RECOVERY:

format = "%s: Unknown server error/n";

break;

case TRY_AGAIN:

format = "%s: Host name lookup failure/n";

break;

default:

format = "%s: Unknown resolver error/n";

break;

}

fprintf( stderr, format, inHostname );

Iperf 源代码分析(四)

Socket 类

Socket的定义和实现分别在文件Socket.hpp和 Socket.cpp中。它的主要功能是封装了socket文件描述符、此socket对应的端口号,以及socket接口中的listen, accept, connect和close等函数,为用户提供了一个简单易用而又统一的接口。同时作为其他派生类的基类。

Socket类的定义如下:

* -------------------------------------------------------------------

* A parent class to hold socket information. Has wrappers around

* the common listen, accept, connect, and close functions.

* ------------------------------------------------------------------- */

#ifndef SOCKET_H

#define SOCKET_H

#include "headers.h"

#include "SocketAddr.hpp"

/* ------------------------------------------------------------------- */

class Socket {

public:

// stores server port and TCP/UDP mode

Socket( unsigned short inPort, bool inUDP = false );

// destructor

virtual ~Socket();

protected:

// get local address

SocketAddr getLocalAddress( void );

// get remote address

SocketAddr getRemoteAddress( void );

// server bind and listen

void Listen( const char *inLocalhost = NULL, bool isIPv6 = false );

// server accept

int Accept( void );

// client connect

void Connect( const char *inHostname, const char *inLocalhost = NULL );

// close the socket

void Close( void );

// to put setsockopt calls before the listen() and connect() calls

virtual void SetSocketOptions( void ) {

}

// join the multicast group

void McastJoin( SocketAddr &inAddr );

// set the multicast ttl

void McastSetTTL( int val, SocketAddr &inAddr );

int mSock; // socket file descriptor (sockfd)

unsigned short mPort; // port to listen to

bool mUDP; // true for UDP, false for TCP

}; // end class Socket

#endif // SOCKET_H

Socket类主要提供了四个函数:Listen,Accept,Connect和Close。getLocalAddress和GetREmoteAddress的作用分别是获得socket本端的地址和对端的地址,两个函数均返回一个SocketAddr实例。 SetSocketOptions的作用是设置socket的属性,它是一个虚函数,因此不同的socket的派生类在实现此函数时会执行不同的操作。下面重点看一下Socket

类的几个函数的实现。

Listen 函数

/* -------------------------------------------------------------------

* Setup a socket listening on a port.

* For TCP, this calls bind() and listen().

* For UDP, this just calls bind().

* If inLocalhost is not null, bind to that address rather than the

* wildcard server address, specifying what incoming interface to

* accept connections on.

* ------------------------------------------------------------------- */

void Socket::Listen( const char *inLocalhost, bool isIPv6 ) {

int rc;

SocketAddr serverAddr( inLocalhost, mPort, isIPv6 );

// create an internet TCP socket

int type = (mUDP ? SOCK_DGRAM : SOCK_STREAM);

int domain = (serverAddr.isIPv6() ?

#ifdef IPV6

AF_INET6

#else

AF_INET

#endif

: AF_INET);

mSock = socket( domain, type, 0 );

FAIL_errno( mSock == INVALID_SOCKET, "socket" );

SetSocketOptions();

// reuse the address, so we can run if a former server was killed off

int boolean = 1;

Socklen_t len = sizeof(boolean);

// this (char*) cast is for old headers that don't use (void*)

setsockopt( mSock, SOL_SOCKET, SO_REUSEADDR, (char*) &boolean, len );

// bind socket to server address

rc = bind( mSock, serverAddr.get_sockaddr(), serverAddr.get_sizeof_sockaddr());

FAIL_errno( rc == SOCKET_ERROR, "bind" );

// listen for connections (TCP only).

// default backlog traditionally 5

if ( ! mUDP ) {

rc = listen( mSock, 5 );

FAIL_errno( rc == SOCKET_ERROR, "listen" );

}

} // end Listen

首先构造一个包含本地服务器地址结构的SocketAddr实例,inLocalhost是本地IP地址(点分十进制字符串或URL,后者在创建 SocketAddr实例是完成地址解析),mPort是Socket构造函数中设置的端口。再通过socket系统调用创建一个socket。SetSocketOptions方法设置此socket的属性。因为SetSocketOptions是虚函数,在Socket类的实现中是一个空函数,而不同的Socket的派生类在覆盖(overwrite)该函数执行的操作是不同的,这是多态特性的应用。此后设置socket的可重用(reuse)属性,使服务器在重启后可以重用以前的地址和端口。此时该socket还没有绑定到某个网络端点(IP地址、端口对)上,bind系统调用完成此功能。最后,如果该socket用于一个TCP 连接,则调用listen函数,一来向系统说明可以接受到socket绑定端口上的连接请求,二来设定请求等待队列的长度为5。

Socket的Listen方法将地址解析(地址结构生成)、socket、bind和listen等系统调用组合为一个函数。在应用时,调用一个Listen方法就可以完成Server端socket初始化的所有工作。

Accept函数

Accept函数是Server完成socket初始化,等待连接请求时调用的函数。代码如下:

/* -------------------------------------------------------------------

* After Listen() has setup mSock, this will block

* until a new connection arrives. Handles interupted accepts.

* Returns the newly connected socket.

* ------------------------------------------------------------------- */

int Socket::Accept( void ) {

iperf_sockaddr clientAddr;

Socklen_t addrLen;

int connectedSock;

while ( true ) {

// accept a connection

addrLen = sizeof( clientAddr );

connectedSock = accept( mSock, (struct sockaddr*) &clientAddr, &addrLen );

// handle accept being interupted

if ( connectedSock == INVALID_SOCKET && errno == EINTR ) {

continue;

}

return connectedSock;

}

} // end Accept

Accept函数为accept系统调用增添了在中断后自动重启的功能。Server线程在执行accept函数是后被阻塞,直到有请求到达,或是接收到某个信号。若是后面一种情况,accept会返回INVALID_SOCKET并置errno为EINTR。Accept方法检查这种情况,并重新调用accept函数。

Connect函数

Connect函数Client端调用的函数,其作用是连接指定的Server。代码如下:

/* -------------------------------------------------------------------

* Setup a socket connected to a server.

* If inLocalhost is not null, bind to that address, specifying

* which outgoing interface to use.

* ------------------------------------------------------------------- */

void Socket::Connect( const char *inHostname, const char *inLocalhost ) {

int rc;

SocketAddr serverAddr( inHostname, mPort );

assert( inHostname != NULL );

// create an internet socket

int type = (mUDP ? SOCK_DGRAM : SOCK_STREAM);

int domain = (serverAddr.isIPv6() ?

#ifdef IPV6

AF_INET6

#else

AF_INET

#endif

: AF_INET);

mSock = socket( domain, type, 0 );

FAIL_errno( mSock == INVALID_SOCKET, "socket" );

SetSocketOptions();

if ( inLocalhost != NULL ) {

SocketAddr localAddr( inLocalhost );

// bind socket to local address

rc = bind( mSock, localAddr.get_sockaddr(), localAddr.get_sizeof_sockaddr());

FAIL_errno( rc == SOCKET_ERROR, "bind" );

}

// connect socket

rc = connect( mSock, serverAddr.get_sockaddr(), serverAddr.get_sizeof_sockaddr()); FAIL_errno( rc == SOCKET_ERROR, "connect" );

} // end Connect

首先构造一个SocketAddr实例保存Server端的地址(IP地址,端口对),同时按需完成地址解析。socket系统调用生成 socket接口。虚函数SetSocketOptions利用多态特性使不同的派生类按需要设置socket属性。如果传入的inLocalhost参数不是空指针,说明调用者希望指定某个本地接口作为连接的本地端点,此时通过bind系统调用把该socket绑定到这个接口对应的IP地址上。最后调用 connect函数完成与远端Server的连接。

讨论: TCP和UDP在调用connect函数是的操作有何不同?

对于TCP连接,调用 connect函数会发起建立TCP连接的三次握手(3-way handshaking)过程。当connect调用返回时,此过程已经完成,连接已经建立。因为TCP连接使用字符流模型,因此在建立好的连接上交换数据时,就好像从一个字符流中读

取,向另一个字符流中写入一样。

而UDP是无连接的协议,使用数据报而不是连接的模型,因此调用connect函数并不发

起连接的过程,也没有任何数据向Server发送,而只是通知操作系统,发往该地址和端口的数据报都送到这个socket连接上来,也就是说,把这个(地址、端口)对和该socket

关联起来。UDP在IP协议的基础上提供了多路访问(multiplex)的服务,UDP的

connect系统调用对这种多路提供了socket接口与对端地址间的对应关系。在UDP连接中,connect提功的这种功能是很有用的。例如,Server可以在接收到一个 Client的数据

报后,分配一个线程执行connect函数与该Client绑定,处理与该client的后继交互,其他

的线程继续在原来的UDP端口上监听新的请求.因为在Client端和Server端都执行了connect函数,所以一个Server与多个Client间的连接不会发生混乱。在 Iperf对UDP的

处理中,就使用了这种技巧。

以上已经简要讨论了Iperf提供的库中几个比较重要的类的定义与实现。接下来将开始研究Iperf本身的实现细节。

Iperf 源代码分析(五)

Iperf的工作机制

Iperf是基于Server-Client模式实现的。在测量网络参数时,Iperf区分听者和说者两种角色。说者向听着发送一定量的数据,由听者统计并记录带宽、时延抖动等参数。说者的数

据全部发送完成后,听者通过向说者回送一个数据包,将测量数据告知说者。这样,在听

者和说者两边都可以显示记录的数据。如果网络过于拥塞或误码率较高,当听者回送的数

据包无法被说者收到时,说者就无法显示完整的测量数据,而只能报告本地记录的部分网

络参数,发送的数据量、发送时间、发送带宽等,像延时抖动等参数在说者一侧则无法获得。

Iperf提供了三种测量模式:normal, tradeoff, dualtest。对于每一种模式,用户都可以通过

-P 选项指定同时测量的并行线程数。以下的讨论假设用户设定的并行线程数为P个。

在normal模式下,Client生成P个说者线程,并行向Server发送数据。Server每接收到

一个说者的数据,就生成一个听者线程,负责与该说者间的通信。Client有P个并行的说

者线程,而Server端有P个并行的听者线程(针对这一Client),两者之间共有P个连接同时收发数据。测量结束后,Server端的每个听者向自己对应的说者回送测得的网络参数。

通达信指标公式源码 混沌操作法

VAR1:=(H+L)/2; AO:=SMA(VAR1,5,1)-SMA(VAR1,34,1),COLOR6699CC; AC:=SMA((AO-SMA(AO,5,1)),5,1),COLOR6699CC; X1:=AO>REF(AO,1) AND AC>REF(AC,1); X2:=AO

红:SMA(Y,5,1),COLORRED; 绿:SMA(Y,3,1),COLORGREEN; 上张:=蓝>=REF(蓝,1) AND 红>=REF(红,1) AND 绿>=REF(绿,1); 下张:=蓝=R2,UL,REF(UL,BARSLAST(H>R2))); 下碎:=IF(L<=R2,DL,REF(DL,BARSLAST(L<=R2))); STICKLINE(BARSLAST(ABS(上碎-REF(上碎,1)))上碎AND REF(C,1)REF(下碎,1)),下碎,下碎,3,1),COLORCYAN; LC := REF(C,4); RMI:=SMA(MAX(C-LC,0),7,1)/SMA(ABS(C-LC),7,1)*100; QS:= HHV(MA(RMI,3),13),COLOR00ADFF; RMIMA:= SMA(RMI,3,1),COLOR009C00; DRAWTEXT(C>上碎&&ISLASTBAR=1,H+0,'向上突破有效上碎型 '),COLOR0000FF; DRAWTEXT(C<下碎&&ISLASTBAR=1,L-0,'向下有效碎型被突破 '),COLORFFFF00; DRAWTEXT(X1>0&&ISLASTBAR=1,H+0.3,'AO与AC为多方趋势 '),COLORFF00FF; DRAWTEXT(X2>0&&ISLASTBAR=1,L-0.3,'AO与AC为空方趋势 '),COLOR00FF00; DRAWTEXT(上张&&ISLASTBAR=1,H+0.6,'鳄鱼向上张嘴'),COLOR999999; DRAWTEXT(下张&&ISLASTBAR=1,L-0.6,'鳄鱼向下张嘴'),COLOR999999; DRAWTEXT(上张&&X1>0&&ISLASTBAR=1,H+0.8,'怀疑中期多头 '),COLORFF00FF; DRAWTEXT(下张&&X2>0&&ISLASTBAR=1,L-0.8,'怀疑中期空头 '),COLOR00FF00; DRAWTEXT((RMI>RMIMA&&RMIRMIMA&&RMI>QS)&&ISLASTBAR=1,H+1,'坚决做多'),COLOR0000FF; DRAWTEXT((RMI20)&&ISLASTBAR=1,L-1,'坚决做空'),COLORFF0000; DRAWTEXT((RMI

Iperf详细使用说明

Iperf使用说明 Iperf是一个TCP/IP和UDP/IP的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;从而能够帮助我们测试网络性能,定位网络瓶颈。 参数说明 -s 以server模式启动,eg:iperf –s -c host以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 –I 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:\iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999

-u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行ipserf,eg:iperf -s –D -R 停止iperf服务,针对-D,eg:iperf -s –R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5

鳄鱼全套指标 通达信指标公式源码

证券交易新空间》关于鳄鱼指标的源码在此。 包括鳄鱼线AO AC 指标。源码不加密。关于使用方法,最好看书《证券混沌操作法》里面说的非常详细,权威。 Y:=(HIGH+CLOSE+LOW)/3; 吻线:REF(SMA(Y,5,1),3),COLORGREEN; 齿线:REF(SMA(Y,8,1),5),COLORRED; 颚线:REF(SMA(Y,13,1),8),COLORBLUE; VAR2:=H>=REF(H,1)&&H>=REF(H,2)&&H>REFX(H,1)&&H>REFX(H,2); VAR3:=L<=REF(L,1)&&L<=REF(L,2)&&LREF(MA55,1),MA55,DRAWNULL),COLORMAGENTA; ★下降:IF(MA55REF(AO,1) AND AC>REF(AC,1); VAR5:=AO=REF(AO,1) AND AC<=REF(AC,1); VAR7:=AO<=REF(AO,1) AND AC>=REF(AC,1); STICKLINE(VAR4, H,L,0,1),COLORRED; STICKLINE(VAR4 AND C>=O,O,C,2.5,1),COLORRED; STICKLINE(VAR4 AND C=O,O,C,2.5,1),COLORGREEN; STICKLINE(VAR5 AND C

iperf使用文档

Iperf使用文档 原理: 1.在服务器端运行命令: 在LINUX下命令:./iperf –s #此命令表示测试TCP模式下的速度 ./iperf –s –u #此命令表示测试UDP模式下的速度 在Windows下命令:iperf –s Iperf –s –u 2.在客户端运行命令: 在Windows下直接输入:iperf –c 服务器ip地址–w 500k #测试TCP模式下的速度,-w后 的参数必须加上,表示测试 100M的带宽 Iperf –c服务器ip地址-u –b 1000m #测试UDP模式下的速度,-b 后的参数必须加载上,默认情 况下UDP协议只测试1M速 率,改成1000M就是测千M 速度。 3.参数说明 -s 以server模式启动,eg:iperf –s -c host以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999 -u 使用udp协议 -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 实例: 服务器端:TCP速率测试

网络测试工具iperf的使用方法

Iperf的使用法 Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。 Iperf使用法与参数说明 参数说明 -s 以server模式启动,eg:iperf -s -c host 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:\iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用)

-M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 -F 指定需要传输的文件 -T 指定ttl值

证券混沌操作法:鳄鱼线

证券混沌操作法:鳄鱼线 证券混沌操作法:鳄鱼线 证券混沌操作法是由比尔?威廉姆(Bill Williams)发展和推广的,他声称这是一套能在全球任何市场长期获取利润的交易方法。目前已有不少交易员使用这套方法在市场中进行交易。 鳄鱼线是运用分形几何学和非线性动力学的一组平均线(实际上就是一种比较特别的均线)。它分为蓝、红、绿三条。蓝线被称为鳄鱼的颚部,红线被称为鳄鱼的牙齿,绿色被称为鳄鱼的唇吻。它们的构造方法如下:颚部——13根价格线的平滑移动均线,并将数值向未来方向移动8根价格线;牙齿——8根价格线的平滑移动平均线,并将数值向未来方向移动5根价格线;唇吻——5根价格线的平滑移动均线,并将数值向未来方向移动3根价格线。 鳄鱼线的基本使用方法是当颚部、牙齿、唇吻纠缠在一起时,我们便进入了观望期(鳄鱼休息了);当唇吻在牙齿以上,牙齿在颚部以上时,我们便进入了多头市场(颚鱼要开始吃牛肉了);当唇吻在牙齿以下,牙齿在颚部以下时,我便进入了空头市场(鳄鱼要开始吃熊肉了)。简单来说鳄鱼线是交易员的指南针,它能告诉交易员市场正处于什么状态,并保证交易员能在行情中进行交易,在市场休整时离场观望。 两套鳄鱼线的源码: 用SMA编的 var1:=(H+L)/2; 下颚:SMA(VAR1,13,1),SHIFT8,COLORBLUE; 牙 齿:SMA(VAR1,8,1),SHIFT5,COLORRED; 上唇:SMA(VAR1,5,1),SHIFT3,COLORGREEN; 用EMA编的

var1:=(H+L)/2; 下颚:SMA(VAR1,13,1),SHIFT8,COLORBLUE; 牙 齿:SMA(VAR1,8,1),SHIFT5,COLORRED; 上唇:SMA(VAR1,5,1),SHIFT3,COLORGREEN;

IPerf使用方法及经验总结

I P e r f使用方法及经验 总结 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

IPerf使用方法及经验总结 Iperf是一个网络性能测试工具,它拥有多个参数,可以测量TCP和UDP的带宽,延时抖动以及丢包率。 一安装 Iperf不需要安装,当需要用Iperf来测试网络中两个结点间的带宽时,只需把文件分别copy到这两台计算机的硬盘中。使用时,直接在命令行窗口中运行带各种参数的iperf命令即可。 二常用参数介绍 这里只介绍几个测试中需要经常使用的参数。更多参数的介绍可以在命令行窗口中输入 iperf –h 或 iperf -help查看。 参数说明 -s 以server模式启动,默认是TCP方式,eg:iperf –s -c host以client模式启动,host是server端地址,eg:iperf -c Note: 这里的server和client的概念跟我们在应用层的理解是相反的。举个例子,LAN和WAN之间,下行数据,我们通常会认为WAN端是server,LAN端是client. 在Iperf中,如果测试下行速率,则是把WAN端作为client,LAN端作为Server.这个一定要记住。 -t 测试时间,默认10秒, eg:iperf –c -t 100 -w 指定窗口大小,默认是8KB -i sec 以秒为单位间隔显示报告,eg:iperf -c -i 2 -u 使用udp协议 -b 指定bindwidth,仅适用于UDP,默认是1Mbit/sec

-l 缓冲区大小,默认是8KB, iperf –c -l 1000 Note:此值在测试UDP时非常重要,如果太小,将导致CFM hang up,如果太大,将导致UDP分片出错,CPE会频繁Down掉。建议此值在800-1200之间。(通过抓包可以看出包的大小). -n 指定传输的字节数, eg:iperf -c -n 100000 -p 指定服务器端或客户端所连接的端口 eg:iperf -s -p 9999; iperf -c -p 9999 三应用举例 测试描述:分别使用TCP和UDP Package测试WAN到LAN之间的下行速率 测试环境: 配置:启动DMZ TCP 1 在LAN端启动server,并修改Window大小 2 在WAN端启动多个Client,修改Window大小,测试时间为100秒,每两秒钟显示一次报告。本例中启动了3个client,其中一个显示如下: 3 运行3个client后,在Server端显示如下: 4 运行完毕后,Server端会统计出相关数据的平均值。

Iperf详细使用方法

Iperf使用方法 Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。 Iperf使用方法与参数说明 参数说明 -s 以server模式启动,eg:iperf -s -c host 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23 通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:\iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5 -F 指定需要传输的文件 -T 指定ttl值

Iperf使用方法与参数说明

Iperf使用方法与参数说明 Iperf是一个网络性能测试工具。可以测试TCP和UDP带宽质量,可以测量最大TCP带宽,具有多种参数和UDP特性,可以报告带宽,延迟抖动和数据包丢失。Iperf在linux和windows平台均有二进制版本供自由使用。 参数说明 -s 以server模式启动,eg:iperf -s -c host以client模式启动,host是server端地址,eg:iperf -c 172.16.10.20 通用参数 -f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 172.16.10.20 -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c 172.16.10.20-i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c 172.16.10.20-l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c 172.16.10.20-o ciperflog.txt

-p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 172.16.10.20-p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行iperf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数

最秘密的股票操作k线波浪技巧

生命是永恒不断的创造,因为在它内部蕴含着过剩的精力,它不断流溢,越出时间和空间的界限,它不停地追求,以形形色色的自我表现的形式表现出来。 --泰戈尔 △▲ 道氏理论的基本法则 一、平均指数包含一切; 二、市场有三种趋势; 1、主要趋势(一年甚至几年); 2、次要趋势(三个星期到三个月,调整位通常为先前趋势运动的三分之一至三分之二,最常见的为百分之五十); 3、小趋势(不到三个星期,细微波动)。 三、主要趋势分为三个阶段; 1、收集阶段(经过一轮大的下跌,市场“利空”消息不断,价格开始企稳,机敏的投资者开始买入); 2、公众参与阶段(价格加速上扬,消息开始转好,大多数技术型趋势追随者开始参与); 3、派发阶段(所有报刊开始刊登看涨故事时,所有人投身市场时,机敏的投资者开始卖出)。 四、各种平均指数必须相互验证; 五、成交量必须印证趋势; 1、上升趋势中,成交量伴随上涨而增加,下跌而减少; 2、下降趋势中,成交量伴随下跌而增加,上涨而减少。 六、趋势在给出明确的反转信号之前被假定一直有效; 1、失效摆动; 高点C挑战高点A失败,随后市场跌破低点B,构成了在点S处的“卖出信号”。

2、非失效摆动。 高点C突破高点A,随后市场跌破低点B构成S1处的第一个“卖出信号”,接着市场反弹到高点E,最后跌破低点D构成S2处的第二个“卖出信号”。 注:失效摆动和非失效摆动在底部时同样有用. 证券混沌操作法:鳄鱼线 证券混沌操作法是由比尔·威廉姆(Bill Williams)发展和推广的,他声称这是一套能在全球任何市场长期获取利润的交易方法。目前已有不少交易员使用这套方法在市场中进行交易。 鳄鱼线是运用分形几何学和非线性动力学的一组平均线(实际上就是一种比较特别的均线)。它分为蓝、红、绿三条。蓝线被称为鳄鱼的颚部,红线被称为鳄鱼的牙齿,绿色被称为鳄鱼的唇吻。它们的构造方法如下:颚部——13根价格线的平滑移动均线,并将数值向未来方向移动8根价格线;牙齿——8根价格线的平滑移动平均线,并将数值向未来方向移动5根价格线;唇吻——5根价格线的平滑移动均线,并将数值向未来方向移动3根价格线。

iperf使用说明

iperf的测试注意事项: 1、iperf不需要安装,只需要把iperf.exe拷贝到指定目录下(server和client 端各拷一个),然后“开始-->运行-->打开中输入"cmd"后确定” 服务器端示例: (示例中将iperf.exe拷贝到了E盘根目录) 按“Ctrl+C”可以马上退出iperf的运行。 客户端示例:(示例所输入的指令中的IP地址为server端的IP地址)

2、参数是大小写敏感的。 3、"iperf -h"就可以显示所有参数的含义信息。其中部分参数含义解释附后。 4、UDP的方式下,默认的发送带宽是1M,所以,需要用参数“-b”来指定发送带宽,如下图所示: 服务器端示例: 客户端示例: 详细参数说明如下: -s 以server模式启动,eg:iperf -s -c host以client模式启动,host是server端地址,eg:iperf -c 10.10.1.8 server专用参数 -D 以服务方式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c 10.10.1.8 -n 100000 -r 单独进行双向传输测试

-t 测试时间,默认10秒,eg:iperf -c 10.10.1.8 -t 5 -F 指定需要传输的文件 -T 指定ttl值(time-to-live) server和client端均可使用的通用参数: -l 缓冲区大小,默认是8KB,eg:iperf -c 10.10.1.8 -l 16 可以使用不同的包长,进行测试 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB 如果窗口太小,有可能丢包 -B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数) -o 将报告和错误信息输出到文件eg:iperf -c 10.10.1.8-o c:\iperflog.txt -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 10.10.1.8-p 9999 -C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 -m 显示tcp最大mtu值 -h 显示帮助信息(参数解释) -i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2 iperf是client端向server端发送数据 server端显示的是接收速率,最好加i参数,进行速率跟踪 client 显示的是发送速率 server 显示接收速率

证券交易新空间一书中的精华包含所有源码

△▲ 道氏理论的基本法则 一、平均指数包含一切; 二、市场有三种趋势; 1、主要趋势(一年甚至几年); 2、次要趋势(三个星期到三个月,调整位通常为先前趋势运动的三分之一至三分之二,最常见的为百分之五十); 3、小趋势(不到三个星期,细微波动)。 三、主要趋势分为三个阶段; 1、收集阶段(经过一轮大的下跌,市场“利空”消息不断,价格开始企稳,机敏的投资者开始买入); 2、公众参与阶段(价格加速上扬,消息开始转好,大多数技术型趋势追随者开始参与); 3、派发阶段(所有报刊开始刊登看涨故事时,所有人投身市场时,机敏的投资者开始卖出)。 四、各种平均指数必须相互验证; 五、成交量必须印证趋势; 1、上升趋势中,成交量伴随上涨而增加,下跌而减少; 2、下降趋势中,成交量伴随下跌而增加,上涨而减少。 六、趋势在给出明确的反转信号之前被假定一直有效; 1、失效摆动; 高点C挑战高点A失败,随后市场跌破低点B,构成了在点S处的“卖出信号”。 2、非失效摆动。

高点C突破高点A,随后市场跌破低点B构成S1处的第一个“卖出信号”,接着市场反弹到高点E,最后跌破低点D构成S2处的第二个“卖出信号”。 注:失效摆动和非失效摆动在底部时同样有用. 证券混沌操作法:鳄鱼线 证券混沌操作法是由比尔·威廉姆(Bill Williams)发展和推广的,他声称这是一套能在全球任何市场长期获取利润的交易方法。目前已有不少交易员使用这套方法在市场中进行交易。 鳄鱼线是运用分形几何学和非线性动力学的一组平均线(实际上就是一种比较特别的均线)。它分为蓝、红、绿三条。蓝线被称为鳄鱼的颚部,红线被称为鳄鱼的牙齿,绿色被称为鳄鱼的唇吻。它们的构造方法如下:颚部——13根价格线的平滑移动均线,并将数值向未来方向移动8根价格线;牙齿——8根价格线的平滑移动平均线,并将数值向未来方向移动5根价格线;唇吻——5根价格线的平滑移动均线,并将数值向未来方向移动3根价格线。 鳄鱼线的基本使用方法是当颚部、牙齿、唇吻纠缠在一起时,我们便进入了观望期(鳄鱼休息了);当唇吻在牙齿以上,牙齿在颚部以上时,我们便进入了多头市场(颚鱼要开始吃牛肉了);当唇吻在牙齿以下,牙齿在颚部以下时,我便进入了空头市场(鳄鱼要开始吃熊肉了)。简单来说鳄鱼线是交易员的指南针,它能告诉交易员市场正处于什么状态,并保证交易员能在行情中进行交易,在市场休整时离场观望。 两套鳄鱼线的源码:

jperf使用说明

经常听到有企业员工抱怨网络速度如何如何缓慢,也经常怀疑花费高昂金额租用来的网络链路是否真的物有所值而没有被电信部门缩水,还有时发现内网链路总是存在着这样或那样不稳定数据传输忽快忽慢的情况。这些问题都是困扰各位网络管理员的实际问题,今天笔者就从自己经验入手为各位讲解如何通过iperf让内网传输速度心知肚明。 一,网络带宽测量工具简介: 一般来说市面上常用的网络带宽及网络吞吐量测量工具主要有以下几种,包括iperf,netperf,chariot等专业的工具。通过他们我们可以实现测量有线网络两个结点或者无线网络任意两个结点之间的传输速度,测量的参数包括数据流方向,吞吐量以及稳定程度等。 当然经常关注我们IT168网络频道的读者都应该对chariot工具比较了解,毕竟我们之前已经有多篇文章介绍他的使用和测量技巧了。但是chariot在实际测量过程中操作过于复杂,很多功能对于我们这些普通用户来说都不太实际,所以在本文中笔者将为各位IT168读者介绍iperf这个工具,在操作上他比chariot更加简单更好上手,适合于初学者以及对网络带宽要求不高环境下的测量。 二,通过下载测量网络传输速度: 在介绍iperf工具的使用之前我们先来看看其他测量网络传输速度的方法,首先是下载法。这个也是大家最常用的方法,即通过到本地网络或本地ISP服务提供商的服务器上下载文件,从而通过传输速度判断自己的网络带宽。 例如笔者所在网络是通过网通服务提供商接入的,所以直接到网通服务器上下载相应的文件,为了保证测量的准确性,我们一般选择单个大容量文件下载测试,通过观察其下载平均值了解当前网络带宽情况。(如图1) 文件下载法是最简单的不借助任何工具即可完成的网络传输速度测量方法,不过这个方法也存在着比较大的误差,我们的测量结果也会随着选择服务器的网络状况变化而改变,特别是当选择了电信服务器时下载速度将没有任何说服力。而且服务器选择也比较麻烦,不能被限制速度也不能够被限制会话连接数。

iperf软件介绍

Iperf是一种用来测量网络带宽和网络质量的工具。Jperf与Iperf一起使用的话可以提供一个java写成的图形界面。 两个运行Iperf的主机将网络分成了两份 可以用以下方法测试连接的质量: - 延时(反应时间或者RTT):用ping命令量度 - jitter(延时变化):用 Iperf UDP 测试来量度 - 数据报丢失:用Iperf UDP 测试来量度 带宽可以通过TCP测试来量度 TCP (Transmission Control Protocol)与 UDP (User Datagram Protocol)的区别是:TCP检查数据包是否正确的传送给接受者,而UDP并不进行检查。所以UDP 的传送速度比TCP要快。 Tperf使用TCP与UDP的不同功能来提供网络连接的统计数据。 最后,Iperf可以很容易的安装在任何UNIX/Linux或者Microsoft Windows系统中。必须将一台主机设置为客户端,一台设置为服务器。 以下是Iperf安装在Linux以及Microsoft Windows系统中的截图。在这里,Linux 是Iperf客户端,Windows是 Iperf服务器端。当然,两个都用上Linux系统也是可以的。 Iperf tests: no arg. -b -r -d -w 缺省设置 数据格式 双向性带宽 同步双向性带宽 TCP窗口大小 -p, -t, -i -u, -b -m -M -P 端口,时间,间隔 UDP测试,带宽设置 显示最大片段大小 最大片段大小设置 平行测试

-h帮助Jperf: no arg. -d -u, -b 缺省设置 同步双向性带宽UDP测试,带宽设置 缺省Iperf设置 同时检查Jperf部分 初始状态,Iperf客户端使用TCP端口5001来连接Iperf服务器,Iperf显示的带宽是从用户到服务器之间的带宽。 如果想使用UDP测试,使用-u参数。 Iperf客户端的-d> 和-r参数可以用来测量双向性带宽。(详情见指导书) 客户端 #iperf -c 10.1.1.1 ------------------------------------------------------------ Client connecting to 10.1.1.1, TCP port 5001 TCP window size: 16384 Byte (default) ------------------------------------------------------------ [ 3] local 10.6.2.5 port 33453 connected with 10.1.1.1 port 5001 [ 3] 0.0-10.2 sec 1.26 MBytes 1.05 Mbits/sec 服务器端 #iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 8.00 KByte (default) ------------------------------------------------------------ [852] local 10.1.1.1 port 5001 connected with 10.6.2.5 port 33453 [ ID] Interval Transfer Bandwidth [852] 0.0-10.6 sec 1.26 MBytes 1.03 Mbits/sec 数据形式(-f参数)

iperf_for_Linux_的安装与使用

安装Iperf 2011-03-20 11:42:49| 分类:Linux | 标签:|字号大中小订阅 ./configure -- configure for your machine make -- compile Iperf make install -- install Iperf, if desired iperf -s (on machine "https://www.doczj.com/doc/c44661702.html,") iperf -c https://www.doczj.com/doc/c44661702.html, (on some other machine) iperf -h (for help screen) iperf -v (for version information) 1、./configure 这一步可能会出问题,即系统没有安装g++,apt-get install g++; 安装完后可以重新编译Iperf,最简单的方法是使用以下命令: 1、make distclean 2、./configure 3、make

iperf for Linux 的安装与使用 来源: ChinaUnix博客日期:2008.07.03 14:47 (共有条评论) 我要评论 什么是Iperf? Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。 编译与安装 Iperf2.0.2目前仅提供源码包的下载。当你下载到Iperf源码包后,在类unix系统上,需要先解压缩源码包,使用解压缩命令gzip或tar。解压后会产生新文件夹“Iperf-2.0.2”。Iperf2.0.2在以下操作系统中可以很好的被编译:Linux,SGI IRIX,HP-UX,Solaris,AIX,和Cray UNICOS。使用“make”命令编译Iperf源码。完整的编译命令如下: tar xvf iperf-2.0.2.tar.gz cd iperf-2.0.2 ./configure make 编译:yum list gcc-c++, yum install gcc-c++.版本

网络测试工具iperf的使用方法

Iperf的使用方法 Iperf 是一个网络性能测试工具。Iperf可以测试TCP和UDP带宽质量。Iperf可以测量最大TCP带宽,具有多种参数和UDP特性。Iperf可以报告带宽,延迟抖动和数据包丢失。Iperf使用方法与参数说明 参数说明 -s 以server模式启动,eg:iperf -s -c host 以client模式启动,host是server端地址,eg:iperf -c 通用参数 -f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c -f K -i sec 以秒为单位显示报告间隔,eg:iperf -c -i 2 -l 缓冲区大小,默认是8KB,eg:iperf -c -l 16 -m 显示tcp最大mtu值 -o 将报告和错误信息输出到文件eg:iperf -c -o c:\ -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c -p 9999 -u 使用udp协议 -w 指定TCP窗口大小,默认是8KB

-B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数)-C 兼容旧版本(当server端和client端版本不一样时使用) -M 设定TCP数据包的最大mtu值 -N 设定TCP不延时 -V 传输ipv6数据包 server专用参数 -D 以服务方式运行ipserf,eg:iperf -s -D -R 停止iperf服务,针对-D,eg:iperf -s -R client端专用参数 -d 同时进行双向传输测试 -n 指定传输的字节数,eg:iperf -c -n 100000 -r 单独进行双向传输测试 -t 测试时间,默认10秒,eg:iperf -c -t 5 -F 指定需要传输的文件 -T 指定ttl值 操作举例:

比尔威廉姆混沌操作法的总结用法

比尔威廉姆-混沌操作法的总结用法 背离线法则入场的方式,如果趋势是顺着背离线的方向发展,那么止损点就设在最近的3根或5根竖线的最低点稍下方(上升趋势),或最近的3根或5根竖线的最高点稍上方(下降趋势),如果趋势逆着背离线的方向运行,则止损点设在反向的分形上,如果鳄鱼线张开,则出场点分三种情况,1.一般情况是收盘价收在红线以下出场,2.在暴涨暴跌的行情中,收盘价收在绿线以下就出场,3.就是AO,AC同时为连续为5根同色的时候,以第5根竖线的最高(下跌行情)或最低价格(上涨行情)突破为出场点。 点评:很多人不太理解背离线是什么,我给大家举几个学习的方式,大家可以深入学习理解,比如K线形态中,穿头破脚,或者反转K线的这种形式来理解背离线会跟容易一些,不要被新名词所误导。 5颗子弹入场方式,也是运用后面这种止损出场方式出场。背离线法则是一种快进快出的法则,适合的止损方式不同于5颗子弹法则。 鳄鱼组线就是运用分形几何学与非线性动力学的一组平衡线,蓝线,绿线,红线都可以叫做平衡线,不过我们实战中使用的平衡线就是蓝线。我们看看三条线的定义: 蓝线:13根价格线的平滑移动均线,并将数值向未来的方向移动8根价格线。 红线:8根价格线的平滑移动均线,并将数值向未来的方向移动5根价格线。 绿线:5根价格线的平滑移动均线,并将数值向未来的方向移动3根价格线。 对于蓝线来说就是当前周期里的平衡线,而红线就是次一级时间结构的平衡线,绿线就是再次一级的时间结构的平衡线,三根竖线是属于不同时间结构的平衡线,但对于实战来说我们只讲本周期的平衡线,也就是蓝线。本周期指的是我们入场时的周期。

点评:鳄鱼线其本质依然是均线,只不过数学算法比普通均线稍微复杂了一点而已。 在混沌理论实战中的入场策略之一就是背离线法则,此法则就是讲求的价格线与平衡线,也就是蓝线之间的夹角的大小来判断趋势的起始点。还有5颗子弹法则入场后的加仓信号中的平衡线加仓信号也是指的蓝线这根平衡线,如果理解成红线和绿线就会出现问题,因为那是次一级和再次一级的时间结构的平衡线。 比如我们在寻找价格线和平衡线的夹角的时候不以蓝线为基准而以红线或绿线为基准,所选择的夹角就会失准。 鳄鱼线的作用很大,总结起来有以下几种: 1.入场前的使用:观察现在所处的位置是推动浪还是调整浪,价格在鳄鱼线上下跳动就是调整浪,价格在鳄鱼线单边运行就是推动浪。 2.入场时的使用:我们可以根据价格线和鳄鱼线之间的夹角的 大小来判断现在是不是一个很好的入场点,如果夹角够大,说明价格受到平衡线的拉力就越大,那么价格运动的动力就越大。 3.入场后的使用:我们在趋势运行的过程中可以根据鳄鱼线中的平衡线的加仓法则来寻找加仓点,这也是市场风险最小的时候,也是我们获取利润的最佳时刻,我们还犹豫什么呢? 4.出场时的使用:我们在趋势快要结束的时候,可以观察价格线的收盘价格在鳄鱼线红线的位置来判断是不是该出场了。 第一本书中提到的macd(5345)与现在混沌理论运用的AO在功能上是一样的,都是用来判断趋势的结束的依据的,不过macd中有条信号线,通过信号线高于或低于macd的竖线来判断动量发生了变化,不过AO已经把竖线的高低用颜色的不同表现了出来,高于前根竖线的竖线用绿线标示,低于前根竖线的竖线用红色表示,只要观察颜色的变化就代表动量发生了变化了,而把信号线去掉了。

Jperf使用方法

Jperf使用方法 Jperf是Iperf在windows系统下的一种拓展软件,从原来的DOS黑白显示增加了更加人性化的UI界面,下面对Jperf的使用方法做简单介绍。 一、软件安装 Jperf是基于JAVA平台开发的一款软件,在使用之前必须下载安装jre环境,否则将无法运行Jperf软件。 Jperf软件下载文件如图1,双击jperf.bat运行Jperf。 图1 Jperf文件 二、软件设置 软件分成client端和server端,需要两台电脑分别运行客户端和服务器,图2为Jperf 主要功能和设置界面。 图2 主要功能和设置 设置服务端:选择运行模式为server,在Client Limit中填写运行客户端的IP地址,保持其他设置不变,点击开始按钮。 图3 服务端设置 设置客户端:选择运行模式Client,在Server address中填写运行服务端的IP地址,Parallel Streams为并发数,可以根据测试情况任意填写。需要开始测试时点击开始按钮。

图4 客户端设置 在图5显示中Transmit设置为测试时间,Output Format为测试结果显示格式,这里推荐使用MBits,可以在测试结果中更加直观的显示结果。 图5 时间和显示设置 三、测试测试结果 在测试结果中,我们主要以客户端显示的结果为主要说明,这里我们将parallel Streams设置为10,Transmit设置为10秒,Output Format设置为MBits。保持服务端处于运行状态,并点击客户端的开始按钮。 随后在软件右侧会显示出得到的结果,如图6,该图中可以以图形界面和文本界面显示出测试结果。 [ ID] Interval Transfer Bandwidth [1844] 0.0-10.0 sec 11.1 MBytes 9.28 Mbits/sec /*线程1844,0至10秒共传输11.1MBytes,带宽9.28Mbps*/ [1748] 0.0-10.0 sec 11.1 MBytes 9.32 Mbits/sec [1812] 0.0-10.0 sec 11.0 MBytes 9.24 Mbits/sec [1860] 0.0-10.0 sec 11.2 MBytes 9.39 Mbits/sec [1764] 0.0-10.0 sec 11.2 MBytes 9.35 Mbits/sec [1780] 0.0-10.0 sec 11.1 MBytes 9.24 Mbits/sec [1796] 0.0-10.0 sec 11.2 MBytes 9.34 Mbits/sec [1732] 0.0-10.0 sec 11.2 MBytes 9.34 Mbits/sec [1828] 0.0-10.0 sec 11.2 MBytes 9.36 Mbits/sec [1876] 0.0-10.0 sec 11.2 MBytes 9.37 Mbits/sec [SUM] 0.0-10.0 sec 111 MBytes 93.2 Mbits/sec/*10秒总计传输111MBytes,总带宽为93.2Mbps*/

相关主题
文本预览
相关文档 最新文档