
將數據發送到套接字。 套接字必須連接到遠程套接字。 返回發送的字節數。 應用程序負責檢查是否已發送所有數據; 如果僅傳輸了一些數據,
則應用程序需要嘗試傳遞剩余數據。(需要用戶自己完成)

將數據發送到套接字。 套接字必須連接到遠程套接字。 與send()不同,此方法繼續從字符串發送數據,直到所有數據都已發送或發生錯誤。
成功后不返回任何內容。 出錯時,會引發異常,並且無法確定成功發送了多少數據(如果有)。
# 發送TCP數據 send()的返回值是發送的字節數量,
#這個數量值可能小於要發送的string的字節數,
# 也就是說可能無法發送string中所有的數據。如果有錯誤則會拋出異常。
s.send()
不是socket自己會運行這個機制,需要用戶自己寫
def mysend(msg): totalsent = 0 while totalsent < MSGLEN: sent =sock.send(msg[totalsent:]) if sent == 0: raise RuntimeError("socket connection broken") totalsent = totalsent + sent
# 發送TCP數據,sendall()嘗試發送string的所有數據,成功則返回None,失敗則拋出異常。
知識補充
首先會對一些常見的網絡編程知識進行補充下:
MTU
通信術語 最大傳輸單元(Maximum Transmission Unit,MTU)是指一種通信協議的某一層上面所能通過的最大數據包大小(以字節為單位)
以以太網傳送IPv4報文為例。MTU表示的長度包含IP包頭的長度,如果IP層以上的協議層發送的數據報文的長度超過了MTU,則在發送者的IP層將對數據報文進行分片,在接收者的IP層對接收到的分片進行重組。
TCP傳輸的可靠性
-
應用數據被分割成
TCP認為最適合發送的數據塊(根據MTU設定)。這和UDP完全不同,應用程序產生的數據長度將保持不變。由TCP傳遞給IP的信息單位稱為報文段或段(segment)。 -
當
TCP發出一個段后,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。當TCP收到發自TCP連接另一端的數據,它將發送一個確認。TCP有延遲確認的功能,在此功能沒有打開,則是立即確認。功能打開,則由定時器觸發確認時間點。 -
TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。 -
既然TCP報文段作為IP數據報來傳輸,而IP數據報的到達可能會失序,因此
TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。 -
既然IP數據報會發生重復,
TCP的接收端必須丟棄重復的數據。 -
TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩沖空間。TCP的接收端只允許另一端發送接收端緩沖區所能接納的數據。這將防止較快主機致使較慢主機的緩沖區溢出。
send()
使用send()進行發送的時候,Python將內容傳遞給系統底層的send接口,也就是說,Python並不知道這次調用是否會全部發送完成,比如MTU是1500,但是此次發送的內容是2000,那么除了包頭等等其他信息占用,發送的量可能在1000左右,還有1000未發送完畢
但是,send()不會繼續發送剩下的包,因為它只會發送一次,發送成功之后會返回此次發送的字節數,如上例,會返回數字1000給用戶,然后就結束了
如果需要將剩下的1000發送完畢,需要用戶自行獲取返回結果,然后將內容剩下的部分繼續調用send()進行發送
sendall()
sendall()是對send()的包裝,完成了用戶需要手動完成的部分,它會自動判斷每次發送的內容量,然后從總內容中刪除已發送的部分,將剩下的繼續傳給send()進行發送;
