【发布时间】:2018-05-23 12:46:40
【问题描述】:
我启动并运行了 UDP 通信。 在一个简单的条带化版本中,客户端基本上是这样做的:(是的,代码中有很多 if 和错误检查,不,没有很多定义,它不会按原样工作。但我更多的是概念这里比实际代码)
sock = socket(AF_INET, SOCK_DGRAM, 0);
server_length = sizeof(struct sockaddr_in);
sendto(sock, "Hi", 3, 0, (struct sockaddr *)&myaddr, server_length);
numRes = recvfrom(sock, (char *)buff, (int)sizeof(buff), 0, (struct sockaddr *)&myaddr, &server_length);
和服务器基本一样:
sock=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock, "Test",5, 0, (struct sockaddr *)&from, fromlen);
这行得通。两端接收对方发送的数据。
这是我的问题:服务器应该同时处理大量请求。我为消息创建了一个队列,以便另一个线程可以处理它们,然后在另一个线程中将它们发送回客户端。当我这样做时,我为发送创建了一个新套接字,使用了与消息相同的“发件人”地址,但客户端从未收到它。
理解必须使用同一个套接字来回复 UDP 消息是否正确?
如果我使用相同的套接字进行发送和接收,如果我有三个客户端发送消息会发生什么,然后在处理完这些消息后,我会以随机顺序回答它们。这行得通吗?
我可以在客户端上创建一个“服务器”,但我猜任何 NAT 都会很快扼杀这个想法。
我尝试尝试的或多或少是这样的:
sock=socket(AF_INET, SOCK_DGRAM, 0);
sock2=socket(AF_INET, SOCK_DGRAM, 0);
bind(sock,(struct sockaddr *)&server,length);
resBytes=recvfrom(sock,buff,(int)sizeof(buff),0,(struct sockaddr *)&from, &fromlen);
sendto(sock2, "Test",5, 0, (struct sockaddr *)&from, fromlen);
如果这种代码应该可以工作,我会回去调试,但现在似乎不是这样。
编辑: 有人添加了“多线程”作为标签。忘记多线程的事情它更多地解释了为什么我不及时响应相同的请求。如果需要的话,我可以在一个线程中进行所有通信。对不起,如果这让人们感到困惑,但我的主要问题是:a)我可以在不定义客户端上的“服务器”的情况下向另一个 socked 发送响应。 b) 如果不是,它将如何处理同一个 socked 上的随机回复顺序(IE 客户端 A 发送,客户端 B 发送,回复客户端 B,然后回复客户端 A)
【问题讨论】:
-
套接字不能被多个线程共享。但是因此UDP是一个无连接协议,你可以使用不同的套接字来接收和发送。
-
@user0042:“套接字不能被多个线程共享。”当然可以。这只是访问如何同步的问题。
-
@alk 好吧,同步有点违背了使用单独线程的目的,不是吗?
-
好吧,忽略线程问题。如果需要,我可以将发送者和接收者放在同一个循环中。这里的主要问题是:a)可以在另一个袜子上发送响应。 b) 如果我以随机顺序响应多个请求怎么办。
标签: multithreading sockets networking udp