Сокеты Python & urllib/httplib (socket.create_connection; s.connect VS s.connect_ex)
Я собрал Python версии 2.7 для мобильных устройств, используя мармелад C++
{В этом вопросе есть рабочий и нерабочий пример кода}
Мой модуль сокетов может:
- Преобразует имена хостов в DNS-адреса (getaddrinfo ок)
- Проверьте подключение к хосту через указанный порт (.connect_ex ok)
Невозможно сделать полное соединение; вопрос:
Python Documentation:
socket.create_connection(address[, timeout[, source_address]])
По какой-то причине, когда я использую socket.create_connection (метод.connect), кортеж 'address', содержащий мой IP-адрес и порт, отбрасывает порт и содержит адрес только при выполнении полного соединения, что делает сокет подключенным, например, xx. xx.xx.xx: 0
ВВОД с использованием.connect (sockaddr)
connectExample.py
import urllib2
response = urllib2.urlopen('http://virtuhorizon.com:80')
print response.info()
html = response.read()
response.close()
Добавлены отладочные операторы, выдержка из httplib.py)
...
def connect(self):
print "===From: httplib ======IP=======: "+str(self.host)
print "===From: httplib ======PORT=====: "+str(self.port)
self.sock = socket.create_connection((self.host,self.port),
self.timeout, self.source_address
...
фрагмент socket.py (определение create_connection): http://pastebin.com/LpWvbFB9
выдержка socketmodule.c (способы подключения): http://www.diffchecker.com/xuyteaed
ВЫХОД [не работает]
(Я добавил несколько операторов print в httplib непосредственно перед созданием соединения):
>>> ===From: httplib ======IP=======: 37.34.63.4
>>> ===From: httplib ======PORT=====: 80
>>> ('37.34.63.4', 80)
>>> <object object at 0xc1b74b0>
>>> None
SOCKET: s3eInetAton: '37.34.63.4'
IWCRT: open 100
SOCKET: s3eSocketCreate -> p=0x00b20d9c id=3000
IWCRT: connect: 100
SOCKET: s3eSocketConnect: 0x00b20d9c -> 37.34.63.4 : 0
ERROR: S3E_SOCKET_ERR_PARAM in s3eSocketConnect
SOCKET: TryConnect error: 10049
SOCKET: NotifyConnect: 3000 0x00b20d9c
SOCKET: Connect: FAILED (1: S3E_SOCKET_ERR_PARAM in s3eSocketConnect)
IWCRT: close 100
SOCKET: s3eSocketClose: 0x00b20d9c open=1
FILE: s3eFileOpen('/pythonHome/Lib/urllib2.py', 'rb') succeeded, id=1027 p=0x00a7dda8
>>> return self.do_open(httplib.HTTPConnection, req)
>>> raise URLError(err)
07/07/14 09:03:57.144: [0xfa0] IWCRT: close 3
07/07/14 09:03:57.159: [0xfa0] FILE: s3eFileClose h=0x00a7dec4
>>> urllib2.URLError: <urlopen error [Errno 22] Invalid argument>
обратите внимание, что порт, к которому подключен сокет, теперь равен 0
Теперь, если я использую coonect_ex, порт остается неизменным, и соединение проходит
ВВОД с использованием.connect_ex (sockaddr)
import socket
import sys
remoteServer = "virtuhorizon.com"
remoteServerIP = socket.gethostbyname(remoteServer)
print "Please wait, scanning remote host", remoteServerIP
try:
for port in range(79,81):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex((remoteServerIP, port))
if result == 0:
print "Port {}: \t Open".format(port)
sock.close()
except socket.gaierror:
print 'Hostname could not be resolved. Exiting'
sys.exit()
except socket.error:
print "Couldn't connect to server"
sys.exit()
ВЫХОД [работает]
SOCKET: s3eInetAton: 'virtuhorizon.com'
SOCKET: s3eInetLookup: 'virtuhorizon.com'
SOCKET: s3eInetLookup (synchronous): done DNS: '74.220.219.55:0'
IWCRT: gethostbyname virtuhorizon.com -> 4a700360
>>> Please wait, scanning remote host 74.220.219.55
IWCRT: open 100
SOCKET: s3eSocketCreate -> p=0x00b20eb8 id=3001
IWCRT: connect: 100
Гнездо: s3eSocketConnect: 0x00b20eb8 -> 74.220.219.55 : 80
ERROR: S3E_SOCKET_ERR_INPROGRESS in s3eSocketConnect
SOCKET: TryConnect error: 10036
SOCKET: Connect: FAILED (1001: S3E_SOCKET_ERR_INPROGRESS in s3eSocketConnect)
SOCKET: TryConnect error: 10056
SOCKET: NotifyConnect: 3001 0x00b20eb8
IWCRT: got connect result: 0
>>> Port 80: Open
IWCRT: close 100
SOCKET: s3eSocketClose: 0x00b20eb8 open=1
>>> Scanning Completed in: 0:00:00
Идеи?
- недостающие настройки в pyconfig?
- проблемы поддержки aton / pton?
- Вопросы поддержки RSIC ( RISCO?)
- обратитесь к разработчикам мармелада за источником s3esocket (не произойдет)