Python Sockets, загрузка почти в 10 раз больше исходного файла, загрузка 0 байт.

0

Создание мобильного приложения со встроенным Python 2.7

Использование Marmalade C++ SDK.

Я интегрирую подключение к службам передачи файлов облаков.

  • FTP: передача файлов работает безупречно
  • Dropbox: аутентификация дает мне: socket [Errno 22] Недопустимый аргумент
  • Google Диск: аутентифицирует, перечисляет метаданные, но передача файлов запрещает какое-то странное поведение

Так как я сделал все привязки к подсистеме сокета marmalade (unix like), но некоторые функции не реализованы. Для подключения к Google Диску сначала я вносил некоторые изменения в httplib2/init.py, устанавливая все экземпляры:

self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

#to this:

self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

После этого небольшого патча я смог успешно подключить и загрузить метаданные с Google Диска. Однако:

  • Когда я загружаю файл 7 КБ, файл появляется на Google Диске, но имеет размер файла 0 байт
  • Когда я загружаю файл 7 Кбайт с помощью urllib, я получаю файл на 54 КБ

Я знаю, что это должно быть связано с неправильной конфигурацией свойств сокета, но не все свойства реализованы. Вот несколько стандартных тестовых выходов python (test_sockets, test_httplib)

Реализация здесь: Marmalade/h/std/netdb.h

Есть ли что-то, что я должен попробовать в качестве жизнеспособной замены?

У меня нет подсказки.

От: unix-man setsockopt (2)

SO_DEBUG          enables recording of debugging information
SO_REUSEADDR       enables local address reuse
SO_REUSEPORT       enables duplicate address and port bindings
SO_KEEPALIVE       enables keep connections alive
SO_DONTROUTE       enables routing bypass for outgoing messages
SO_LINGER         linger on close if data present
SO_BROADCAST       enables permission to transmit broadcast messages
SO_OOBINLINE       enables reception of out-of-band data in band
SO_SNDBUF         set buffer size for output
SO_RCVBUF         set buffer size for input
SO_SNDLOWAT       set minimum count for output
SO_RCVLOWAT       set minimum count for input
SO_SNDTIMEO       set timeout value for output
SO_RCVTIMEO       set timeout value for input
SO_ACCEPTFILTER    set accept filter on listening socket
SO_TYPE       get the type of the socket (get only)
SO_ERROR          get and clear error on the socket (get only)

Вот мой исходный код загрузки/загрузки/записи Google

Надеюсь, это будет грубой силой, пока проблема не будет решена. Сообщение об отмене, если я это выясню

  • 1
    Ваше описание довольно запутанно. Либо оригинальная версия с TCP_NODELAY, а ваша с SO_REUSEADDR по сути не имеет ничего общего с описанными проблемами. TCP_NODELAY может только увеличить скорость интерактивного обмена, но HTTP на самом деле это не нужно. SO_REUSEADDR не влияет на соединение, только на привязку порта. Я думаю, чтобы диагностировать проблему, вы должны захватить сетевой трафик и проанализировать его. Вы можете ожидать самопроизвольного сброса и / или множественных повторных передач пакетов.
  • 0
    Гораздо более вероятно, что ваш код в основном не работает.
Показать ещё 2 комментария
Теги:
sockets
google-drive-sdk

1 ответ

0

Я понял. это было 2 проблемы с моим кодом обработки файлов.

при загрузке:

database_file = drive.CreateFile()
database_file['title'] = packageName
# this needs to be set
database_file.SetContentFile(packageName)
#
database_file['parents']=[{"kind": "drive#fileLink" ,'id': str(cloudfolderid) }]

При загрузке я использовал неправильный URL (webContentLink предназначен только для браузеров, используйте "downloadUrl"). Мне также понадобилось создать заголовок для авторизации загрузки

import urllib2
import json


url = 'https://doc-14-5g-docs.googleusercontent.com/docs/securesc/n4vedqgda15lkaommio7l899vgqu4k84/ugncmscf57d4r6f64b78or1g6b71168t/1409342400000/13487736009921291757/13487736009921291757/0B1umnT9WASfHUHpUaWVkc0xhNzA?h=16653014193614665626&e=download&gd=true'

#Parse saved credentials
credentialsFile = open('./configs/gcreds.dat', 'r')
rawJson =  credentialsFile.read()
credentialsFile.close()
values = json.loads(rawJson)

#Header must include: {"Authorization" : "Bearer xxxxxxx SomeToken xxxxx"}
ConstructedHeader = "Bearer " + str(values["token_response"]["access_token"])
Header = {"Authorization": ConstructedHeader}

req = urllib2.Request( url, headers= Header )
response = urllib2.urlopen(req)

output = open("UploadTest.z.crypt",'wb')
output.write(response.read())
output.close()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню