差異處
這裏顯示兩個版本的差異處。
python:socket:send_resource_temporarilty_unvailable_error [2016/09/12 11:02] tony [How to?] |
python:socket:send_resource_temporarilty_unvailable_error [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>python socket}} | ||
- | ====== socket.send with Resource temporarily unavailable error ====== | ||
- | ===== Problem ===== | ||
- | 我的python程式如下,目標是建立一個socket server等待連線,並將檔案給送到socket client: | ||
- | <code python> | ||
- | import socket | ||
- | import os | ||
- | import sys | ||
- | import stat | ||
- | from os.path import dirname, abspath, join | ||
- | def transmitDebugInfo(): | ||
- | filename = "/bootpart.gz" | ||
- | |||
- | debugfile = None | ||
- | s = None | ||
- | conn = None | ||
- | try: | ||
- | debugfile = open(filename,'rb') | ||
- | blocksize = os.path.getsize(filename) | ||
- | |||
- | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||
- | s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | ||
- | s.settimeout(60) | ||
- | s.bind(('0.0.0.0', 5555)) | ||
- | s.listen(1) | ||
- | conn, addr = s.accept() | ||
- | data = debugfile.read() | ||
- | conn.send(data) | ||
- | except: | ||
- | print sys.exc_info()[0] | ||
- | print sys.exc_info()[1] | ||
- | finally: | ||
- | if s is not None: | ||
- | s.close() | ||
- | if conn is not None: | ||
- | conn.close() | ||
- | if debugfile is not None: | ||
- | debugfile.close() | ||
- | |||
- | |||
- | transmitDebugInfo() | ||
- | </code> | ||
- | 我的client為了方便測試,是直接使用linux的nc command: | ||
- | <code bash> | ||
- | nc 192.168.0.1 5555 > test.txt | ||
- | </code> | ||
- | 然而,在VMWare ESXI6.0 u2下會出現以下錯誤: | ||
- | <code> | ||
- | <class `socket.error`> | ||
- | [Errno 11] Resource temporarilty unavaliable | ||
- | </code> | ||
- | ===== Debug ===== | ||
- | 首先我發現接收到的檔案大小一定是33304 bytes,於是我加了以下程式做試驗: | ||
- | <code python> | ||
- | print "bufsize = %s" % s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) | ||
- | s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 5000) | ||
- | print "bufsize = %s" % s.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) | ||
- | </code> | ||
- | server程式輸出為: | ||
- | <code> | ||
- | bufsize = 32768 | ||
- | bufsize = 5000 | ||
- | </code> | ||
- | 而client輸出檔案大小則變為5792 bytes。我猜想可能和發送buffer有關,於是找了一台ubuntu 14.04做測試;沒想到雖然buffer size為16384卻能正常的發送完檔案。 | ||
- | |||
- | ===== Reference ===== | ||
- | * [[https://fwengineer.blogspot.tw/2013/05/setsockopt.html|setsockopt]] | ||
- | |||
- | |||
- | ===== ===== | ||
- | ---- | ||
- | \\ | ||
- | ~~DISQUS~~ |