Python Socket API 筆記 分類: socket 2013-08-10 15:06 2320人閱讀 評論(0) 收藏

將上節中的C#該成Python版的容易程度大大超出了個人意料以外。歷來沒有發現,僅僅用灰塵簡單的幾句話就實現了該程序的主要功能,可見python的簡易和強大之處。這裏先對SocketAPI 作一下總結。html


Socket API 筆記(PythonSocket API 詳見這裏


一、Socket的地址表示

  • 單獨的字符串,用於AF_UNIX地址族
  • (host,port)對,用於AF_INET地址族。其中host是一字符串,能夠是‘www.google.com’ 域名形式或是‘203.208.46.180’這種ipv4地址的形式;port是一整數。
  • (host,port,flowinfo,scopeid)四元組(4-tuple),用於AF_INET6地址族

二、錯誤與異常

    全部的錯誤都將引起異常。通常的異常有如 invalidargument type 或是 out-of-memoryconditions。與socket或地址語義相關的錯誤將引起socket.error異常。與Socket相關的異常有:python

  • socket.error:由Socket相關錯誤引起
  • socket.herror:由地址相關錯誤引起
  • socket.gaierror:由地址相關錯誤,如getaddrinfo()或getnameinfo()引起
  • socket.timeout:當socket出現超時時引起。超時時間由settimeout()提早設定

    (與異常相伴的錯誤信息請查閱API說明)windows


三、經常使用函數

  • socket.has_ipv6:判斷平臺是否支持IPV6
  • socket.create_connection(address[,timeout[, source_address]]):
    建立一個正在監聽的地址,並返回Socket對象
  • socket.getaddrinfo(host,port, family=0, socktype=0, proto=0, flags=0):
    返回一個包含5元組的list,用來得到host的地址信息
  • socket.gethostbyname(hostname):
    將host主機名轉換爲ipv4地址
  • socket.gethostbyname_ex(hostname):根據hostname獲取一個主機關於IP和名稱的全面的信息。
    功能擴展的gethostbyname函數,返回主機名、主機別名列表、主機IP地址列表
  • socket.gethostname():返回python解釋器運行的機器hostname,返回當前主機名
  • socket.gethostbyaddr(ip_address):
    經過ip地址,返回包括主機名的三元組:(hostname, aliaslist, ipaddrlist)
  • socket.getnameinfo(sockaddr,flags):
  • socket.getprotobyname(protocolname):
  • socket.getservbyname(servicename[,protocolname]):
    經過給定的服務名,協議名,返回該服務所在的端口號
  • socket.getservbyport(port[,protocolname]):
    返回該端口號的服務名,如‘80’:‘http’
  • socket.socket([family[,type[, proto]]]):
    經過給定的地址族,socket類型和端口號,建立新的Socket。默認地址族爲AF_INET,socket類型爲SOCK_STREAM,端口號爲0或省略
  • socket.socketpair([family[,type[, proto]]]):可用平臺,unix
  • socket.fromfd(fd, family,type[, proto]):可用平臺,unix
  • socket.ntohl(x):將32位正整數從網絡字節序轉換爲機器字節序
  • socket.ntohs(x):將16爲正整數從網絡字節序轉換爲機器字節序
  • socket.htonl(x):將32爲正整數從機器字節序轉換爲網絡字節序
  • socket.htons(x):將16位正整數從機器字節序轉換爲網絡字節序
    (關於字節序看這裏) 
  • socket.inet_aton(ip_string):
    將點分十進制字符串ipv4地址形式轉化爲32位二進制形式,即一個4個字符的字符串,通常用於標準C庫函數中的struct_in_addr
  • socket.inet_ntoa(packed_ip):上個函數的反操做
  • socket.inet_pton(address_family,ip_string):相似上述操做,可用平臺,部分unix
  • socket.inet_ntop(address_family,packed_ip):相似上述操縱,可用平臺,部分unix
  • socket.getdefaulttimeout():返回socket默認超時時間,以秒計(float)
  • socket.setdefaulttimeout(timeout):設置Socket默認超時時間,以秒計(float)
  • socket.SocketType:這是python的類型對象,表示socket的類型

四、Socket對象方法

  • socket.accept():返回(conn,address)對,其中conn是新的socket對象,在其上能夠發送和接收數據;address是另外一端的socket地址
  • socket.bind(address):將socket綁定到地址上,該socket必須以前沒有作過綁定操做
  • socket.close():關閉socket,該socket以後對該socket所作的的全部操做將失敗,遠端鏈接將不會收到數據。當虛擬機進行垃圾回收時,該socket將被自動關閉
  • socket.connect(address):鏈接該地址上的遠端Socket
  • socket.connect_ex(address):相似上面操做,但出錯時返回錯誤代碼而非觸發異常,能夠很好的支持異步鏈接
  • socket.fileno():
  • socket.getpeername():
  • socket.getsockname():返回Socket本身的地址,對查找端口號有用
  • socket.getsockopt(level,optname[, buflen]):
  • socket.ioctl(control,option):可用平臺 windows,具體看這裏
  • socket.listen(backlog):監聽socket鏈接,參數表示最大鏈接隊列數。該參數與系統有關。一般是5,最小爲0
  • socket.makefile([mode[,bufsize]]):返回與socket相關的file對象,FileObjects看這裏
  • socket.recv(bufsize[,flags]):接收數據,返回表示接收到數據的String。buffersize表示一次接收到的數據的最大量
  • socket.recvfrom(bufsize[,flags]):接收數據,返回(String ,address)對。
  • socket.recvfrom_into(buffer[,nbytes[,flags]]):接收數據,將其寫入參數buffer而非生成字符串。返回(nbyte,address),其中nbyte是接收到的數據量,address是發送端的地址。
  • socket.recv_into(buffer[,nbytes[, flags]]):接收數據,區別於上的是,僅返回nbyte——接收數量,沒有地址
  • socket.send(string[,flags]):發送數據,該socket必須與遠端socket鏈接。返回發送的數據量。程序本身負責檢查是否全部的數據均已發送,並本身處理未發送數據。
  • socket.sendall(string[,flags]):發送數據。與上函數不一樣的是,該函數會持續發送數據直到數據發送完畢或出現錯誤爲止。若成功發送,返回none,但當錯誤發生時,將沒法判斷髮送了多少數據。
  • socket.sendto(string[,flags],address):向socket發送數據,該socket不該該鏈接遠端socket,由於目的socket使用地址表示的。該函數返回發送的數據量
  • socket.setblocking(flag):設置阻塞或非阻塞模式。flag=0時被設置爲非阻塞模式,其餘爲阻塞模式。新建的socket均爲阻塞模式。當在非阻塞模式下,若是recv()函數執行中,沒有收到任何數據,或是send()函數沒有當即處理掉數據,error異常將會被觸發;在阻塞模式下,執行函數將被阻塞直到其能夠執行。s.setblocking(0)等同於 s.settimeout(0.0),s.setblocking(1)等同於s.settimeout(None)
  • socket.settimeout(value):設置阻塞模式下socket的超時時間,其值能夠是非負數的float類型,以秒計,或是None。若給定float,socket的後續操做若在給定超時時間內沒有完成,將觸發timeout異常;若給定None,則使超時設置失效
  • socket.gettimeout():返回超時時間(float,以秒計)或None
  • socket.setsockopt(level,optname, value):
  • socket.shutdown(how):
  • socket.family:python類型,socket族
  • socket.type:python類型,socket類型
  • socket.proto:python類型,socket協議
相關文章
相關標籤/搜索