一个插槽何时足够,何时需要创建更多?

时间:2010-08-09 08:34:40

标签: sockets networking udp client-server sendto

UDP的“无连接”方面让我感到厌恶...

如果我将UDP套接字设置为INADDR_ANY,然后将其绑定到本地计算机上的端口33445,则计算机将接受来自各个客户端的传入连接。所有这些连接都将由该一个套接字提供服务,因为这不是TCP,我无法生成新的子套接字来直接处理每个连接。我可以从他们的最新消息回复任何,部分或全部这些连接的客户端。

所以对我来说有点模糊的地方就在这里......

我能否随时向这些客户发送消息?或者我只能发送回复recvfrom()的消息吗?

另外,如果我希望该服务器(在为客户端提供服务时)连接到另一台服务器并进行其他事情的对话,我认为我需要为此目的创建一个新的套接字?我不能只使用现有的服务器套接字并指定新的目标地址吗?

非常感谢这个精彩的社区。

编辑:让我换一种说法..似乎我只能使用绑定套接字来响应之前在该套接字上找到我的客户端。要启动与新主机的对话,我不能简单地为此目的使用绑定套接字?我必须创建一个新的套接字才能到达正在监听的服务器,对吗?

2 个答案:

答案 0 :(得分:3)

UDP套接字可以在两种不同的模式下运行:

  • 默认未连接模式:收到发送到进程端口/地址的所有数据报;您需要为每次发送指定目标地址。
  • 已连接模式:仅接收从您连接的地址/端口发送的数据报;您不需要在每次发送时指定目标地址。

以下是connected UDP sockets的小评论。

编辑:

这是一个小的python UDP服务器,它接受来自任何客户端的数据包并将它们复制到第二个服务器。一切都是通过一个未连接的UDP套接字完成的。

#!/usr/bin/env python
import sys, socket, string

if len( sys.argv ) != 4:
        print "Usage: udptee <local-listen-port> <copy-host> <copy-port>"
        exit( 1 )

copy = ( sys.argv[2], int( sys.argv[3] ))

s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
#s.bind(( 'localhost', int( sys.argv[1] )))
s.bind(( '', int( sys.argv[1] )))

print "listening on ", s.getsockname()
print "copying to", copy

while True:
        line, addr = s.recvfrom( 1024 )
        print "received: ", line, " from ", addr
        s.sendto( line, addr ) # echo to source
        s.sendto( line, copy ) # copy to tee
        if string.strip( line ) == "exit": break

print "Goodbye and thanks for all the fish"
s.close()

在一个终端中运行:

~$ ./udptee 9090 <IP-of-copy-server> 9999

然后在第二学期以服务器模式启动netcat。这个将接受数据报的副本:

# this used to be "nc -ul 127.0.0.1 9999" which only listened on loopback
~$ nc -ul 9999

在第三个学期启动netcat客户端以将内容发送到第一个服务器:

~$ nc -u <IP-of-tee-server> 9090

开始输入并查看两个服务器回显您输入的内容。

答案 1 :(得分:1)

UDP套接字未连接到远程主机或客户端,因此您需要做的就是使用目标地址和已初始化的UDP套接字来使用sendto()。所以,是的,您可以随时使用UDP套接字发送消息,因为您已正确设置UDP套接字。只需在您正在使用的sockaddr结构中设置接收地址即可。如果接收部分在您发送消息的端口上绑定了UDP套接字,则它将接收该消息。

在第二个问题上,这完全取决于与第二个服务器的对话是否使用不同的端口。如果它使用相同的端口,则无需创建另一个UDP套接字。您只需要将服务器1从其客户端获取的消息与从服务器2以某种方式获得的消息分开。

我建议你看看Beej的优秀指南5.8和6.3。

Beej's Guide to Network Programming