> When I use a tcp socket to connect to remote host, I may get an "actively refused"

WSAECONNREFUSED == 10061

> or "time out" error in 1st time.

WSAETIMEDOUT == 10060

> Then when I retry to connect to remote host, I "always" got "Software caused connection abort"

WSAECONNABORTED == 10053

http://msdn.microsoft.com/en-us/library/ms740668%28VS.85%29.aspx

I don't know why you say the former two are "normal" -- actually all
the tree mean that there's a problem with your host sockets: either
there's no listening socket or it closes an accepted socket, or
there's some other issue in the host.

Thanks a lot for helping. I'm still a newbie in asio/socket  programming.
The socket may be used to connect to a remote host behind NAT which may send back a RST packet or silently drop it. This is expected response.

It seems "Software caused connection abort" error is related to my program. The document you pointed confirms this:

"An established connection was aborted by the software in your host computer, possibly due to a data transmission time-out or protocol error."

The way I use can be sketched by:
============================
open a tcp socket
bind to a port
asynchronously connect to a remote host
in callback if it fails (may get expected errors), asynchronously reconnect to remote host, up to specified times
In callback I get "abort" error after every reconnect

Any further help to debug this is appreciated.