rely on GCDAsyncSocket