分析协议构造验证数据,采用异步非阻塞socket发送数据,不采用request的方式。
采用非阻塞的connect,每个IP测试4个端口。
之前没分清国内和国外的IP段,导致去扫国外的,一片超时。所以才有下文的超时处理,但是国内一般不会涉及到超时。但这里还是要说下自己的想法。
首先采用非阻塞的connect,会立即返回,如果返回EINPROGRESS
,表明正在连接属于正常,在此期间使用getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
获取socket的错误,无论对于正在连接还是连接完成都返回0,直到出现超时异常或其他错误,才返回其他错误码。
假如三次握手包,要在网络中存在N秒多,那这几秒内,没有函数去判断是否连接完成,因为处在正在连接的过程中,getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)
对于正在连接和连接完成的socket都返回0。但是我们可以通过read()
或者send()
或者getpeername()
报异常,来判断。
几个注意点:
- 1.IP的区段 http://ips.chacuo.net/
- 2.非阻塞connect的返回码'EINPROGRESS',表示正在连接
- 3.http代理的验证方式,send一段http报文,验证返回.
当你发送CONNECT %s:%s HTTP/1.1\r\nHost: %s:%s\r\nProxy-Connection: keep-alive\r\n\r\n
,接收到的response包含b'Connection established'
表明,可以作为代理
当你发送b'\x05\x02\x00\x02'
,接收到的data包含b'\x05\x00'
,可以作为代理,这里仅仅是简单说明,但其中还涉及到验证等等复杂问题。