recv和recvfrom,使用python进行套接字编程

时间:2016-03-20 15:53:55

标签: python sockets

我是python的新手,也是socket编程的新手。

我对DECLARE @str VARCHAR(100)='300|2€&ÄÖÜ|This is text -> should be text|2015-12-31'; SELECT @str FOR XML PATH(''); /* 300|2€&amp;ÄÖÜ|This is text -&gt; should be text|2015-12-31 */ DECLARE @Xml XML=(SELECT CAST('<x>' + REPLACE((SELECT @str FOR XML PATH('')),'|','</x><x>')+'</x>' AS XML)); SELECT @Xml.value('/x[1]','int') AS IntTypeSave ,@Xml.value('/x[3]','varchar(max)') AS VarcharTypeSave ,@Xml.value('/x[4]','datetime') AS DateTypeSave; /* 300 This is text -> should be text 2015-12-31 00:00:00.000 */ SELECT X.value('.','varchar(max)') AS EachX FROM @Xml.nodes('/x') AS Each(X); /* 300 2€&ÄÖÜ This is text -> should be text 2015-12-31 */ socket.recvfrom()

感到困惑

我理解通常对于UDP,人们使用socket.recv()而对于TCP,人们使用recvfrom()

例如,

recv()

如上例所示,我感到困惑的是数字。为什么2048和1024用于不同的协议?这些数字代表什么?请解释。我希望我很清楚。谢谢。

3 个答案:

答案 0 :(得分:4)

你让他们换了。 TCP套接字应使用socket.recv,UDP套接字应使用socket.recvfrom。这是因为TCP是面向连接的协议。创建连接后,它不会更改。另一方面,UDP是无连接(“发送 - 忘记”)协议。您使用recvfrom,因此您知道应该向谁发送数据。 Recvfrom不能以相同的方式在TCP套接字上工作。

对于1024/2048,这些表示您要接受的字节数。一般来说,UDP比TCP具有更少的开销,允许您接收更多数据,但这不是一个严格的规则,在这种情况下几乎可以忽略不计。您可以根据需要尽可能多地收到。 4096也是常见的(对于两者而言)。

答案 1 :(得分:2)

我认为人们通常会将recvfrom用于UDP。因为在TCP中,一旦建立连接,地址信息就不会改变,因此recvfrom总是为连接信息字段返回None。

在上面的代码中,它将在此行中出错:

message2, clientAddress2 = serverSocketTCP.recv(1024)

由于: recvfrom()返回(data,connection_information)和 recv()只返回数据。因此,它会引发ValueError,因为您正在尝试解压缩非元组值。

1024或2048只定义缓冲区大小,但它不会在返回之前等待那么多数据。例如:

#One side, 'receiver' is a socket
receiver.recv(2048)

#Second side, 'sender' is a socket
sender.send('abc'.encode('utf-8'))

显然,'sender'发送的数据远小于2048字节,但'recv'调用将在收到'sender'发送给它的数据后立即返回

答案 2 :(得分:2)

为什么2048和1024用于不同的协议?

这些是非常随意的数字,取决于正在实施的协议。即使TCP号有效,您提供的UDP号也很可能是错误的。

TCP实现了一个流协议,您可以在任何大小的块中读取它。您可以recv(1)一次获取一个字节,如果要获取大块,可以recv(100000)recv可以自由地返回您要求的较小的块,因此您可能会获得与您想要的不同的大小。 1024非常小,你可以毫无问题地阅读更大的块。

UDP实现消息协议。您必须要求足够的字节来覆盖整个消息,否则它将被丢弃。这个大小取决于协议。它通常用于将消息限制为1500(标准以太网数据包的最大大小)的协议,但它可以是高达65535的任何内容。检查实际协议规格的最大值。