黑客第一章補充

網(wǎng)絡(luò)

今天閱讀第二章的時候發(fā)現(xiàn)有一些網(wǎng)絡(luò)模塊很不熟悉,返回第一章好好閱讀了下socket模塊的簡單應(yīng)用,然后百度了一些socket庫的使用說明,現(xiàn)在就記錄在這里

socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,對于文件用【打開】【讀寫】【關(guān)閉】模式來操作。socket就是該模式的一個實現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO、打開、關(guān)閉)
基本上,Socket 是任何一種計算機網(wǎng)絡(luò)通訊中最基礎(chǔ)的內(nèi)容。例如當你在瀏覽器地址欄中輸入 http://www.cnblogs.com/ 時,你會打開一個套接字,然后連接到 http://www.cnblogs.com/ 并讀取響應(yīng)的頁面然后然后顯示出來。而其他一些聊天客戶端如 gtalk 和 skype 也是類似。任何網(wǎng)絡(luò)通訊都是通過 Socket 來完成的。
socket和file的區(qū)別:
  1、file模塊是針對某個指定文件進行【打開】【讀寫】【關(guān)閉】
  2、socket模塊是針對 服務(wù)器端 和 客戶端Socket 進行【打開】【讀寫】【關(guān)閉】

image.png

sk.bind(address)
  s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族。在AF_INET下,以元組(host,port)的形式表示地址。
sk.listen(backlog)
  開始監(jiān)聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數(shù)量。
backlog等于5,表示內(nèi)核已經(jīng)接到了連接請求,但服務(wù)器還沒有調(diào)用accept進行處理的連接個數(shù)最大為5
這個值不能無限大,因為要在內(nèi)核中維護連接隊列
sk.setblocking(bool)
  是否阻塞(默認True),如果設(shè)置False,那么accept和recv時一旦無數(shù)據(jù),則報錯。
sk.accept()
  接受連接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù)。address是連接客戶端的地址。
  接收TCP 客戶的連接(阻塞式)等待連接的到來
sk.connect(address)
  連接到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
sk.connect_ex(address)
  同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061
sk.close()
  關(guān)閉套接字
sk.recv(bufsize[,flag])
  接受套接字的數(shù)據(jù)。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量。flag提供有關(guān)消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag])
  與recv()類似,但返回值是(data,address)。其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。
sk.send(string[,flag])
  將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送。
sk.sendall(string[,flag])
  將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常。
內(nèi)部通過遞歸調(diào)用send,將所有內(nèi)容發(fā)送出去。
sk.sendto(string[,flag],address)
  將數(shù)據(jù)發(fā)送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。返回值是發(fā)送的字節(jié)數(shù)。該函數(shù)主要用于UDP協(xié)議。
sk.settimeout(timeout)
  設(shè)置套接字操作的超時期,timeout是一個浮點數(shù),單位是秒。值為None表示沒有超時期。一般,超時期應(yīng)該在剛創(chuàng)建套接字時設(shè)置,因為它們可能用于連接的操作(如 client 連接最多等待5s )
sk.getpeername()
  返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。
sk.getsockname()
  返回套接字自己的地址。通常是一個元組(ipaddr,port)
sk.fileno()
  套接字的文件描述符

connect時需要指定socket的AF_FAMILY和端口類別:
AF_INET、AF_INET6、AF_LOCAL
SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET

指定IP地址和TCP端口,使用socket連接,獲取服務(wù)的banner

s.connect(("192.168.x.xx",21))
ans = s.recv(1024)
prnt ans```

###threading模塊的應(yīng)用
threading提供了一個比thread模塊更高層的API來提供線程的并發(fā)性。這些線程并發(fā)運行并共享內(nèi)存。 

     一、Thread的使用 目標函數(shù)可以實例化一個Thread對象,每個Thread對象代表著一個線程,可以通過start()方法,開始運行。 
     這里對使用多線程并發(fā),和不適用多線程并發(fā)做了一個比較: 
首先是不使用多線程的操作: 
代碼如下:

!/usr/bin/python

compare for multi threads

import time

def worker():
print "worker"
time.sleep(1)
return

if name == "main":
for i in xrange(5):
worker()

執(zhí)行結(jié)果如下: 
    ![image.png](http://upload-images.jianshu.io/upload_images/2616921-93d38c367bc3fa05.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下面是使用多線程并發(fā)的操作: 
代碼如下: 

!/usr/bin/python

import threading
import time

def worker():
print "worker"
time.sleep(1)
return

for i in xrange(5):
t = threading.Thread(target=worker)
t.start()

 ![image.png](http://upload-images.jianshu.io/upload_images/2616921-c66ce962cab0e377.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

可以明顯看出使用了多線程并發(fā)的操作,花費時間要短的很多。
更詳細threading用法請見以下鏈接:
http://blog.chinaunix.net/uid-27571599-id-3484048.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容