關於python使用原始套接字的信息

本文目錄一覽:

python3套接字udp設置接受數據超時

Sometimes,you need to manipulate the default values of certain properties of a socket library, for example, the socket timeout.

設定並獲取默認的套接字超時時間。

1.代碼

1 import socket

2

3

4 def test_socket_timeout():

5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

6 print(“Default socket timeout: %s” % s.gettimeout())

7 # 獲取套接字默認超時時間

8 s.settimeout(100)

9 # 設置超時時間

10 print(“Current socket timeout: %s” % s.gettimeout())

11 # 讀取修改後的套接字超時時間

12

13

14 if __name__ == ‘__main__’:

15 test_socket_timeout()

2. AF_INET和SOCK_STREAM解釋

1 # 地址簇

2 # socket.AF_INET IPv4(默認)

3 # socket.AF_INET6 IPv6

4 # socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信

5

6 # socket.SOCK_STREAM(數據流) 提供面向連接的穩定數據傳輸,即TCP/IP協議.多用於資料(如文件)傳送。

3.gettimeout()和settimeout()解釋

1 def gettimeout(self): # real signature unknown; restored from __doc__

2 “””

3 gettimeout() – timeout

4

5 Returns the timeout in seconds (float) associated with socket

6 operations. A timeout of None indicates that timeouts on socket

7 operations are disabled.

8 “””

9 return timeout

10

11

12 def settimeout(self, timeout): # real signature unknown; restored from __doc__

13 “””

14 settimeout(timeout)

15

16 Set a timeout on socket operations. ‘timeout’ can be a float,

17 giving in seconds, or None. Setting a timeout of None disables

18 the timeout feature and is equivalent to setblocking(1).

19 Setting a timeout of zero is the same as setblocking(0).

20 “””

21 pass

22 # 設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。

23 # 一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )

4.運行結果

1 Default socket timeout: None

2 Current socket timeout: 100.0

怎麼用python和原始套接字發送一tcp數據包

TCP的首部格式:

0 1 2 3

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Source Port | Destination Port |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Sequence Number |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Acknowledgment Number |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Data | |U|A|P|R|S|F| |

| Offset| Reserved |R|C|S|S|Y|I| Window |

| | |G|K|H|T|N|N| |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Checksum | Urgent Pointer |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| Options | Padding |

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

| data |

-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

—Source Port是源端口,16位。

—Destination Port是目的端口,16位。

—Sequence Number是發送數據包中的第一個位元組的序列號,32位。

—Acknowledgment Number是確認序列號,32位。

—Data Offset是數據偏移,4位,該字段的值是TCP首部(包括選項)長度乘以4。

—標誌位: 6位,URG表示Urgent Pointer字段有意義:

ACK表示Acknowledgment Number字段有意義

PSH表示Push功能,RST表示複位TCP連接

SYN表示SYN報文(在建立TCP連接的時候使用)

FIN表示沒有數據需要發送了(在關閉TCP連接的時候使用)

Window表示接收緩衝區的空閑空間,16位,用來告訴TCP連接對端自己能夠接收的最大數據長度。

—Checksum是校驗和,16位。

—Urgent Pointers是緊急指針,16位,只有URG標誌位被設置時該字段才有意義,表示緊急數據相對序列號(Sequence Number字段的值)的偏移。

更多TCP協議的詳細信息可以在網上輕易找到,在這裡不再贅述。

為了建立一個可以自己構造數據的包,我們使用”SOCK_RAW”這種socket格式,使用”IPPROTO_RAW”協議,它會告訴系統我們將提供網絡層和傳輸層。

s = socket.socket(socket.AF_INET,socket.SOCK_RAW,)

通過這個簡單的類,我們可以進行IP頭部信息構造

class ip(object):

def __init__(self, source, destination):

self.version = 4

python socketserver和socket的區別

區別:

1.首先介紹下socket

socket的英文原義是「孔」或「插座」。作為BSD UNIX的進程通信機制,取後一種意思。通常也

稱作”套接字”,用於描述IP地址和端口,是一個通信鏈的句柄,可以用來實現不同虛擬機或不同計算機之間的通信。在Internet上的主機一 般運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不同的端口對應於不同的服務。Socket正如其英文原 意那樣,像一個多孔插座。一台主機猶如布滿各種插座的房間,每個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務

2、連接原理

根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽,客戶端請求,連接確認。

(1)服務器監聽:是服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態。

(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求。

(3)連接確認:是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接 字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

案例

1、最簡單的web服務器

2、簡單的聊天工具

(1)service端

(2)client端

3、更多功能

更多功能

sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)

參數一:地址簇

socket.AF_INET IPv4(默認)

socket.AF_INET6 IPv6

socket.AF_UNIX 只能夠用於單一的Unix系統進程間通信

參數二:類型

socket.SOCK_STREAM流式socket , for TCP (默認)

socket.SOCK_DGRAM 數據報式socket , for UDP

socket.SOCK_RAW 原始套接字,普通的套接字無法處理ICMP、IGMP等網絡報文,而

SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以

通過IP_HDRINCL套接字選項由用戶構造IP頭。

socket.SOCK_RDM 是一種可靠的UDP形式,即保證交付數據報但不保證順序。

SOCK_RAM用來提供對原始協議的低級訪問,在需要執行某些特殊操作時使用,

如發送ICMP報文。SOCK_RAM通常僅限於高級用戶或管理員運行的程序使用。

socket.SOCK_SEQPACKET 可靠的連續數據包服務

參數三:協議

0(默認)與特定的地址家族相關的協議,如果是 0 ,

則系統就會根據地址格式和套接類別,自動選擇一個合適的協議

sk.bind(address)

s.bind(address) 將套接字綁定到地址。address地址的格式取決於地址族。

在AF_INET下,以元組(host,port)的形式表示地址。

sk.listen(backlog)

開始監聽傳入連接。backlog指定在拒絕連接之前,可以掛起的最大連接數量。

backlog等於5,表示內核已經接到了連接請求,但服務器還沒有調用accept進行處理的

連接個數最大為5,這個值不能無限大,因為要在內核中維護連接隊列

sk.setblocking(bool)

是否阻塞(默認True),如果設置False,那麼accept和recv時一旦無數據,則報錯。

sk.accept()

接受連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收

和發送數據。address是連接客戶端的地址。接收TCP 客戶的連接(阻塞式)等待連接的到來

sk.connect(address)

連接到address處的套接字。一般,address的格式為元組(hostname,port),

如果連接出錯,返回socket.error錯誤。

sk.connect_ex(address)

同上,只不過會有返回值,連接成功時返回 0 ,連接失敗時候返回編碼,例如:10061

sk.close()

關閉套接字

sk.recv(bufsize[,flag])

接受套接字的數據。數據以字符串形式返回,bufsize指定最多可以接收的數量。

flag提供有關消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag])

與recv()類似,但返回值是(data,address)。其中data是包含接收數據的字符串,

address是發送數據的套接字地址。

sk.send(string[,flag])

將string中的數據發送到連接的套接字。返回值是要發送的位元組數量,

該數量可能小於string的位元組大小。即:可能未將指定內容全部發送。

sk.sendall(string[,flag])

將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據。

成功返回None,失敗則拋出異常。

內部通過遞歸調用send,將所有內容發送出去。

sk.sendto(string[,flag],address)

將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地址。

返回值是發送的位元組數。該函數主要用於UDP協議。

sk.settimeout(timeout)

設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時期。

一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作

(如 client 連接最多等待5s )

sk.getpeername()

返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。

sk.getsockname()

返回套接字自己的地址。通常是一個元組(ipaddr,port)

sk.fileno()

套接字的文件描述符

二、socket server

SocketServer內部使用 IO多路復用 以及 「多線程」 和 「多進程」 ,從而實現並發處理多個客戶端請求的Socket服務端。即:每個客戶端請求連接到服務器時,Socket服務端都會在服務器是創建一個「線程」或者「進 程」 專門負責處理當前客戶端的所有請求。

註:導入模塊的時候 3.x版本是socketserver 2.x版本是SocketServer

1.ThreadingTCPServer

ThreadingTCPServer實現的Soket服務器內部會為每個client創建一個 「線程」,該線程用來和客戶端進行交互。

ThreadingTCPServer基礎

使用ThreadingTCPServer:

創建一個繼承自 SocketServer.BaseRequestHandler 的類

類中必須定義一個名稱為 handle 的方法

啟動ThreadingTCPServer

服務端

客戶端

內部調用流程為:

啟動服務端程序

執行 TCPServer.init 方法,創建服務端Socket對象並綁定 IP 和 端口

執行 BaseServer.init 方法,將自定義的繼承自SocketServer.BaseRequestHandler 的類 – MyRequestHandle賦值給 self.RequestHandlerClass

執行 BaseServer.server_forever 方法,While 循環一直監聽是否有客戶端請求到達 …

當客戶端連接到達服務器

執行 ThreadingMixIn.process_request 方法,創建一個 「線程」 用來處理請求

執行 ThreadingMixIn.process_request_thread 方法

執行 BaseServer.finish_request 方法,執行 self.RequestHandlerClass() 即:執行 自定義 MyRequestHandler 的構造方法(自動調用基類BaseRequestHandler的構造方法,在該構造方法中又會調用 MyRequestHandler的handle方法)

ForkingTCPServer

ForkingTCPServer和ThreadingTCPServer的使用和執行流程基本一致,只不過在內部分別為請求者建立 「線程」 和 「進程」。

python的原始字符串有什麼用

打開Windows運行,輸入cmd,進入命令行窗口,在命令行窗口輸入python,進入python交互環境

使用python原始字符串,需要加『r』,代碼如下

a=r’a\bc’

print(a)

這裡字符串a中包含了轉義字符『\』

『\』是轉義字符,如果不使用python原始字符是下面的結果。

對比第2步和第3步的結果,不難發現python原始字符就是所見即所得,即使是轉義字符也會原樣呈現,測試原始字符串的實際內容,代碼如下:

print (r’a\b’ == ‘a\\b’)

原始字符串在正則表達式中使用廣泛,例如:

import re

ret = re.findall(r’a\nb’,’a\nb’)

print (ret)

如果不使用原始字符串,第5步也可以成功匹配。

同時不使用原始字符,使用兩個轉義字符也能匹配成功,如下圖所示。但是使用轉義字符的好處就在於不管正則表達式多少個轉義字符,規則只要和要匹配對象寫一致就行了。

原創文章,作者:JASCT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/130598.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JASCT的頭像JASCT
上一篇 2024-10-03 23:29
下一篇 2024-10-03 23:29

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論