Python 2.6.4 - Urllib2 - Windows XP - Reading streaming HTTP source kills network card ... (believe it or not)

2010-01-12 Thread Sandy Walsh
This is very odd. Hopefully someone can shed some insight. I've tried 
this with Python 2.5.2 and recently upgraded to 2.6.4 and see the same 
problem.


I'm running on Windows XP sp3. I'm interfacing with an IP camera that 
streamed jpeg frames at 10fps over HTTP.


The format of the stream is:

4 bytes - size of the frame N
N bytes - the jpeg frame

I have the following program to read the data. It works fine for about 
30-40 iterations and then my NIC dies. All connectivity to the outside 
world goes away until I need to reboot. So, first I thought it was a 
driver problem. I've replaced the NIC, tried other drivers, you name it 
... same problem.


I've tried it on another machine and while it doesn't take down the NIC, 
all communications to the camera after a while fail with connection 
reset by peer exception.


The camera attempts to keep sending frame after frame (one every 100ms), 
but I'm only interested in the first frame. After I grab it I kill the 
connection to the camera. There is still data coming in. I assume it's 
in HTTP Chunked format, but have not put Wireshark on it yet. I suspect 
Python doesn't like me killing the connection when there is still data 
coming down ... but why would it take down my NIC too?


The code is very simple:

#-
import urllib2
import struct
import time
import datetime

ip='192.168.1.189'
username='user'
password='password'

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = http://%s; % ip
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib2.HTTPBasicAuthHandler(password_mgr)

opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)

url = http://%s/user/img_stream0.cgi; % (ip, )

while 1:
response = urllib2.urlopen(url)

size_bytes = response.read(4)
size, = struct.unpack(i, size_bytes)

frame = response.read(size)
response.close()

print Got , datetime.datetime.now()
time.sleep(1)
#-

Which gives the following output:

testpull.py
Got  2010-01-12 15:30:08.125000
Got  2010-01-12 15:30:09.453000
Got  2010-01-12 15:30:10.812000
Got  2010-01-12 15:30:12.156000
Got  2010-01-12 15:30:13.515000
Got  2010-01-12 15:30:14.89
Got  2010-01-12 15:30:16.265000
Got  2010-01-12 15:30:17.625000
Got  2010-01-12 15:30:19.031000
Got  2010-01-12 15:30:20.39
Got  2010-01-12 15:30:21.765000
Got  2010-01-12 15:30:23.093000
Got  2010-01-12 15:30:24.437000
Got  2010-01-12 15:30:25.765000
Got  2010-01-12 15:30:27.109000
Got  2010-01-12 15:30:28.75
Got  2010-01-12 15:30:30.078000
Got  2010-01-12 15:30:31.437000
Got  2010-01-12 15:30:32.781000
Got  2010-01-12 15:30:34.546000
Got  2010-01-12 15:30:35.906000
Got  2010-01-12 15:30:37.25
Got  2010-01-12 15:30:38.609000
Got  2010-01-12 15:30:39.953000
Got  2010-01-12 15:30:41.281000
Got  2010-01-12 15:30:42.578000
Got  2010-01-12 15:30:43.921000
Got  2010-01-12 15:30:45.25
Got  2010-01-12 15:30:46.562000
Got  2010-01-12 15:30:47.89
Got  2010-01-12 15:30:49.265000
Got  2010-01-12 15:30:50.625000
Got  2010-01-12 15:30:51.968000
Got  2010-01-12 15:30:53.328000
Got  2010-01-12 15:30:54.734000
Traceback (most recent call last):
  File C:\dev\5110Snapshot\testpull.py, line 22, in module
response = urllib2.urlopen(url)
  File C:\Python26\lib\urllib2.py, line 124, in urlopen
return _opener.open(url, data, timeout)
  File C:\Python26\lib\urllib2.py, line 389, in open
response = self._open(req, data)
  File C:\Python26\lib\urllib2.py, line 407, in _open
'_open', req)
  File C:\Python26\lib\urllib2.py, line 367, in _call_chain
result = func(*args)
  File C:\Python26\lib\urllib2.py, line 1146, in http_open
return self.do_open(httplib.HTTPConnection, req)
  File C:\Python26\lib\urllib2.py, line 1121, in do_open
raise URLError(err)
urllib2.URLError: urlopen error [Errno 10060] A connection attempt 
failed because the connected party did not properly
respond after a period of time, or established connection failed because 
connected host has failed to respond


At which point all connectivity on the PC is dead.

This is truly bizarre.

Anyone have any insights as to what might be happening. Or is there 
something blatantly wrong with my code?


Help!
-Sandy



attachment: swalsh.vcf-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6.4 - Urllib2 - Windows XP - Reading streaming HTTP source kills network card ... (believe it or not)

2010-01-12 Thread Sandy Walsh
I've also run this under IronPython 2.6 and, while it takes longer 
(about 5 minutes), I get the same results. And this too takes down the 
NIC on the PC.


It's gotta be something with my PC, so don't sweat it ... time for an 
upgrade I think.


-S

attachment: swalsh.vcf-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6.4 - Urllib2 - Windows XP - Reading streaming HTTP source kills network card ... (believe it or not)

2010-01-12 Thread MRAB

Sandy Walsh wrote:
This is very odd. Hopefully someone can shed some insight. I've tried 
this with Python 2.5.2 and recently upgraded to 2.6.4 and see the same 
problem.


I'm running on Windows XP sp3. I'm interfacing with an IP camera that 
streamed jpeg frames at 10fps over HTTP.


The format of the stream is:

4 bytes - size of the frame N
N bytes - the jpeg frame

I have the following program to read the data. It works fine for about 
30-40 iterations and then my NIC dies. All connectivity to the outside 
world goes away until I need to reboot. So, first I thought it was a 
driver problem. I've replaced the NIC, tried other drivers, you name it 
... same problem.


I've tried it on another machine and while it doesn't take down the NIC, 
all communications to the camera after a while fail with connection 
reset by peer exception.


The camera attempts to keep sending frame after frame (one every 100ms), 
but I'm only interested in the first frame. After I grab it I kill the 
connection to the camera. There is still data coming in. I assume it's 
in HTTP Chunked format, but have not put Wireshark on it yet. I suspect 
Python doesn't like me killing the connection when there is still data 
coming down ... but why would it take down my NIC too?


The code is very simple:

#-
import urllib2
import struct
import time
import datetime

ip='192.168.1.189'
username='user'
password='password'

password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
top_level_url = http://%s; % ip
password_mgr.add_password(None, top_level_url, username, password)

handler = urllib2.HTTPBasicAuthHandler(password_mgr)

opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)

url = http://%s/user/img_stream0.cgi; % (ip, )

while 1:
response = urllib2.urlopen(url)

size_bytes = response.read(4)
size, = struct.unpack(i, size_bytes)

frame = response.read(size)
response.close()

print Got , datetime.datetime.now()
time.sleep(1)
#-

Which gives the following output:

testpull.py
Got  2010-01-12 15:30:08.125000
Got  2010-01-12 15:30:09.453000
Got  2010-01-12 15:30:10.812000
Got  2010-01-12 15:30:12.156000
Got  2010-01-12 15:30:13.515000
Got  2010-01-12 15:30:14.89
Got  2010-01-12 15:30:16.265000
Got  2010-01-12 15:30:17.625000
Got  2010-01-12 15:30:19.031000
Got  2010-01-12 15:30:20.39
Got  2010-01-12 15:30:21.765000
Got  2010-01-12 15:30:23.093000
Got  2010-01-12 15:30:24.437000
Got  2010-01-12 15:30:25.765000
Got  2010-01-12 15:30:27.109000
Got  2010-01-12 15:30:28.75
Got  2010-01-12 15:30:30.078000
Got  2010-01-12 15:30:31.437000
Got  2010-01-12 15:30:32.781000
Got  2010-01-12 15:30:34.546000
Got  2010-01-12 15:30:35.906000
Got  2010-01-12 15:30:37.25
Got  2010-01-12 15:30:38.609000
Got  2010-01-12 15:30:39.953000
Got  2010-01-12 15:30:41.281000
Got  2010-01-12 15:30:42.578000
Got  2010-01-12 15:30:43.921000
Got  2010-01-12 15:30:45.25
Got  2010-01-12 15:30:46.562000
Got  2010-01-12 15:30:47.89
Got  2010-01-12 15:30:49.265000
Got  2010-01-12 15:30:50.625000
Got  2010-01-12 15:30:51.968000
Got  2010-01-12 15:30:53.328000
Got  2010-01-12 15:30:54.734000
Traceback (most recent call last):
  File C:\dev\5110Snapshot\testpull.py, line 22, in module
response = urllib2.urlopen(url)
  File C:\Python26\lib\urllib2.py, line 124, in urlopen
return _opener.open(url, data, timeout)
  File C:\Python26\lib\urllib2.py, line 389, in open
response = self._open(req, data)
  File C:\Python26\lib\urllib2.py, line 407, in _open
'_open', req)
  File C:\Python26\lib\urllib2.py, line 367, in _call_chain
result = func(*args)
  File C:\Python26\lib\urllib2.py, line 1146, in http_open
return self.do_open(httplib.HTTPConnection, req)
  File C:\Python26\lib\urllib2.py, line 1121, in do_open
raise URLError(err)
urllib2.URLError: urlopen error [Errno 10060] A connection attempt 
failed because the connected party did not properly
respond after a period of time, or established connection failed because 
connected host has failed to respond


At which point all connectivity on the PC is dead.

This is truly bizarre.

Anyone have any insights as to what might be happening. Or is there 
something blatantly wrong with my code?


Help!


Have you tried keeping the connection open and just reading and
discarding the frames you don't want?
--
http://mail.python.org/mailman/listinfo/python-list