如何在编程套接字时区分TCP/UDP

16

以下是一个Python套接字代码片段:

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

我的问题是:这行代码是否表明套接字连接将通过TCP/IP传输?到目前为止,我只编写了TCP连接,并使用上述代码,但可能我没有意识到这一点。我能否使用Python套接字编写UDP连接?我如何区分传输层?

这个问题与Python并不直接相关,欢迎用C++或其他任何语言进行解释。

3个回答

18
第二个参数决定套接字类型;socket.SOCK_DGRAM 表示 UDP 套接字,socket.SOCK_STREAM 表示 TCP 套接字。前提是你使用的是 AF_INET 或者 AF_INET6 套接字族。
在继续之前,也许你想要阅读一下Python 套接字编程 HOWTO,以及其他套接字编程教程。UDP 和 TCP 套接字之间的差异相当大,但这些差异可跨编程语言进行转换。
有关 Python 套接字的一些信息,请查看 Python Wiki:

如果第一个参数是AF_INET,则“...,它是一个TCP套接字”。 - Robᵩ
同意,STREAM 意味着一个 TCP 连接。 - pmoleri

10

创建套接字的一般语法如下:

socket(socket_family, socket_type, protocol=0)

我们可以使用AF_INET(用于IPv4)或AF_INET6(IPv6)作为第一个参数,即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。有关TCP和UDP各自的方法的更多信息,请参阅socket文档。此外,Wesley Chun的《Core Python应用编程》是一本关于套接字编程的基础知识的好书。


-1
主要区别在于TCP套接字是基于连接的。在与远程机器上的另一个TCP套接字连接之前,您无法发送或接收任何内容。一旦连接成功,TCP套接字只能发送和接收来自远程机器的数据。这意味着您需要为应用程序中的每个客户端都分配一个TCP套接字。 UDP不是基于连接的,您可以使用同一个套接字随时向任何人发送和接收数据。

没有回答被问的问题。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接