2013-11-01 57 views
9

下面是一個Python插座片段時,如何區分TCP/UDP:編程插座

import socket 
socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

我的問題是:沒有線路狀態whethet套接字連接將通過TCP/IP傳輸?到目前爲止,我只是使用上面的代碼來編寫TCP連接,但可能我沒有意識到這一事實。我能使用python套接字編程UDP連接嗎?我怎樣才能區分傳輸層?

這個問題並不嚴格地與python相關,在C++或其他任何地方也都歡迎解釋。

回答

9

第二個參數決定套接字類型; socket.SOCK_DGRAM是UDP,socket.SOCK_STREAM是一個TCP套接字。這一切都提供您使用的是AF_INETAF_INET6插座系列。

在繼續之前,也許你想去看看Python socket programming HOWTO以及其他套接字編程教程。 UDP和TCP套接字之間的區別是相當大的,但差異會跨編程語言翻譯。

對Python的維基插座的一些信息:

+0

「* ...,它是一個TCP套接字*」iff第一個參數是AF_INET。 –

+0

@Robᵩ:或'AF_INET6' –

+0

同意,'STREAM'表示一個tcp連接。 – pmoleri

5

創建插座一般語法是:

socket(socket_family, socket_type, protocol=0) 

我們可以使用AF_INET(用於IPv4)或AF_INET6(IPv6)作爲fir st參數i。,e表示socket_family。

socket_type是確定要創建的套接字是TCP還是UDP的參數。對於TCP套接字,它將是SOCK_STREAM,對於UDP,它將是SOCK_DGRAM(DGRAM - 數據報)。最後,我們可以省略將其設置爲默認值'0'的協議參數。

對於TCP套接字,您應該爲服務器套接字使用bind(),listen()和accept()方法,爲客戶端套接字使用connect()或connect_ex()方法。 UDP套接字不需要listen(),accept()和connect()方法(因爲TCP套接字是面向連接的套接字,而UDP套接字是沒有連接的套接字)。

有一些特定的方法可用於UDP分別發送和接收數據包recvfrom()和sendto(),而recv()和send()用於TCP。請參閱此documentation for socket以獲取有關TCP和UDP各自方法的更多信息。另外Core Python Applications Programming by Wesley Chun是一本關於套接字編程的好書。

+1

感謝您的解釋,尤其是對於本書! – ducin

0

主要區別在於TCP套接字是基於連接的。直到連接到遠程計算機上的另一個TCP套接字,才能發送或接收任何內容。連接後,TCP套接字只能發送到遠程機器或從遠程機器接收數據。這意味着您的應用程序中每個客戶端都需要一個TCP套接字。 UDP不是基於連接的,你可以隨時用同一個套接字發送和接收任何人。

〜Muralidhar gundala