之前學習過一些python的socket程式設計和requests庫,時間一久,就容易生疏和遺忘,後面我想要學習pwntools的原始碼,封裝的tube模組的函式,一定也是通過套接字來進行通訊的。
最近複習一波,加深印象,溫故而知新。
socket庫,用socket()函式來建立套接字,實現伺服器與伺服器之間的通訊。
socket.socket([family[,type[,proto] ] ])
socket函式有三個引數,分別如下:
family:套接字家族可以使用af_unix或者af_inet,af_unix函式用於同一臺機器上的程序通訊(即本機通訊),af_inet可以實現不同伺服器之間的通訊。
type:套接字型別可以依據是面向連線還是非連線sock_stream或sock_dgram。sock_stream引數表示基於tcp的流式socket通訊,管發管收。sock_dgram引數表示基於udp的資料報式傳輸,只管發,不管收。
s.bind(address):將套接字繫結到位址,在af_inet下,以s.bind(host,port)元組的方式傳入,如s.bind(host,port)。
s.listen(backlog):開始監聽tcp傳入連線,backlog指定在拒絕鏈結前,作業系統可以掛起的最大連線數。
s.accept():接受tcp鏈結並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料,address是鏈結客戶端的位址。
s.connect(adress):鏈結到address處的套接字,一般address的格式為tuple(host,port),如果鏈結出錯,則返回socket.error錯誤。
s.connect_ex(address):功能與s.connect(address)相同,但成功返回0.失敗返回errno。
s.recv(bufsize[,flag]):接受套接字資料,資料以字串的形式返回,bufsize指定要接受的最大資料量。
s.send(string[,flag]):傳送tcp資料,將字串中的資料傳送到鏈結的套接字,返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。
s.sendto(string,address):udp協議是無連線狀態的協議,所以我們在傳送資料的過程中沒有用connect方法來進行連線。string引數就代表我們要傳送的資料,address表示位址(由tuple(host,port)表示)。
s.recvfrom(bufsize[,flag]):接收udp資料,返回值是tuple(data,address)。其中data是包含接受資料的字串,address形式為tuple(host,port)的套接字位址。
s.sendall(string[,flag]):完整傳送tcp資料,將字串中的資料傳送到鏈結的套接字,但在返回之前嘗試傳送所有資料。
s.close():關閉套接字。
s.getpeername():返回套接字的遠端位址,返回值通常是乙個tuple(ipaddr,port)
s.getsockname():返回套接字自己的位址,返回值通常是乙個tuple(ipaddr,port)
s.fileno():返回套接字的檔案描述符。
我們編寫乙個簡易的tcp客戶端如下所示:
我們編寫乙個簡易的tcp服務端如下:
importsocket
import
threading
bind_ip="
127.0.0.1
"bind_port=9999server=socket.socket(socket.af_inet,socket.sock_stream)
server.bind((bind_ip,bind_port))
server.listen(5)
print("
[*]listening on %s:%d
"%(bind_ip,bind_port))
defhandle_client(client_socket):
request=client_socket.recv(1024)
print("
[*]received:%s
"%request)
client_socket.send(
"ack")
client_socket.close()
while
true:
client,addr=server.accept()
print("
[*]accept connection from:%s:%d
"%(addr[0],addr[1]))
client_handler=threading.thread(target=handle_client,args=(client,))
client_handler.start()
我們可以寫乙個簡單的tcp客戶端與服務端進行互動:
importsocket
target_ip="
127.0.0.1
"target_port=9999
while
true:
client=socket.socket(socket.af_inet,socket.sock_stream)
client.connect((target_ip,target_port))
data=raw_input("
[*]please input your data:")
client.send(data)
response=client.recv(4096)
print("
[*]response data:%s
"%response)
client.close()
Python網路程式設計 HTTP 一
傳送乙個簡單http get請求到遠端的服務 from urllib import request,parse base url being accessed url dictionary of qurey parameters parms encode the query string query...
python 網路程式設計(一) 基礎
1.理解tcp 1.1 定址 首先任何基於tcp ip的網路,每台機器都有唯一的ip位址,只需要知道接受者機器的ip位址,資訊就可以傳送過去。其次,tcp通過使用埠號來知道機器究竟是哪個程式應該接收傳來過來的資料,每個程式都使用唯一乙個埠號,有時候這些埠號是事先知道的,有時候是隨機指定的。再次,讓使...
python核心程式設計筆記 網路程式設計(一)
套接字 通訊端點 列印伺服器是硬體伺服器的乙個例子。它們處理傳入的列印作業並將其傳送給系統中的列印裝置。這樣的計算機通常可以通過網路進行訪問,並且客戶端計算機向它傳送列印請求。另乙個例子是檔案伺服器。這些通常是擁有龐大的儲存容量的計算機,可悲客戶端遠端訪問,支援檔案伺服器的乙個最流行的網路作業系統是...