python網路程式設計(一)

2022-05-23 09:27:15 字數 3353 閱讀 2823

之前學習過一些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服務端如下:

import

socket

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客戶端與服務端進行互動:

import

socket

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核心程式設計筆記 網路程式設計(一)

套接字 通訊端點 列印伺服器是硬體伺服器的乙個例子。它們處理傳入的列印作業並將其傳送給系統中的列印裝置。這樣的計算機通常可以通過網路進行訪問,並且客戶端計算機向它傳送列印請求。另乙個例子是檔案伺服器。這些通常是擁有龐大的儲存容量的計算機,可悲客戶端遠端訪問,支援檔案伺服器的乙個最流行的網路作業系統是...