recv()失败(111:连接拒绝),从上游代理和阅读时,
我有一个UDP发件人和一个接收器,当我直接将这两个与随机端口连接到本地计算机中的9999时,它们都交换了消息。现在,我希望发件人发送到NGINX LOAD BALENCER,并且NGINX负载平衡器应将UDP流转向接收器。现在,在发件人端,我将数据发送到端口9999。在接收器时,我正在听端口5000。因此,我的nginx.conf如下。
stream{
upstream dns_servers {
least_conn;
server 127.0.0.1:5000;
}
server {
listen 9999 udp;
#UDP traffic will be forwarded to the "dns_servers" upstream group
proxy_pass dns_servers;
proxy_responses 1;
}
}
我的nginx在docker内部运行,因此我的“ docker-compose”文件如下
version: '3.4'
services:
edsproxynginx:
image: nginx
extra_hosts:
- "host.docker.internal:127.0.0.1"
,我的'docker-compose-override.yml'文件如下如下,
version: '3.4'
services:
edsproxynginx:
container_name: edsproxynginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs/:/var/log/nginx/
- ./error/:/error/
restart: always
ports:
- "9999:9999/udp"
现在我启动了nginx容器,帖子,帖子我启动了接收器之后,我在此之后启动了我启动发件人。现在错误。log我遇到以下错误,
2022/07/03 04:51:17 [error] 31#31: *49085 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49087 sendmsg() failed (111: Connection refused)
while proxying and sending to upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:2760/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49089 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49091 sendmsg() failed (111: Connection refused)
while proxying and sending to upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:2760/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49093 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49095 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49097 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49099 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
我缺少什么吗?
编辑: 好的,这是发件人和接收器源代码段中用C#
发件人侧代码
using var udpSocket = new Socket(SocketType.Dgram, ProtocolType.Udp);
var userExitSource = GetUserConsoleCancellationSource();
var cancelToken = userExitSource.Token;
const int PacketSize = 1380;
// Discard our socket when the user cancels.
using var cancelReg = cancelToken.Register(() => udpSocket.Dispose());
IPAddress.TryParse("127.0.0.1", out var destination);
var ipEndPoint = new IPEndPoint(destination, 9999);
byte[] buffer = GC.AllocateArray<byte>(PacketSize, pinned: true);
Memory<byte> bufferMem = buffer.AsMemory();
// Put something approaching meaningful data in the buffer.
for (var idx = 0; idx < PacketSize; idx++)
{
bufferMem.Span[idx] = (byte)idx;
}
Console.WriteLine("Ready to send");
while (!cancelToken.IsCancellationRequested)
{
object value = await udpSocket.SendToAsync(bufferMem, SocketFlags.None, ipEndPoint, cancelToken);
Console.WriteLine("Sent to " + ipEndPoint.Port.ToString());
Thread.Sleep(1000);
}
ANS接收器侧代码
public class Listner : BackgroundService
{
private const int PacketSize = 1380;
private static readonly IPEndPoint _blankEndpoint = new IPEndPoint(IPAddress.Any, 5000);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Console.WriteLine("++++++++++++++++++");
using var udpSocket = new Socket(SocketType.Dgram, ProtocolType.Udp);
using var cancelReg = stoppingToken.Register(() => udpSocket.Dispose());
udpSocket.Bind(new IPEndPoint(IPAddress.Any, 5000));
Console.WriteLine("Bind successful");
await DoReceiveAsync(udpSocket, stoppingToken);
}
private async Task DoReceiveAsync(Socket udpSocket, CancellationToken cancelToken)
{
byte[] buffer = GC.AllocateArray<byte>(length: 65527, pinned: true);
Memory<byte> bufferMem = buffer.AsMemory();
while (!cancelToken.IsCancellationRequested)
{
try
{
var result = await
udpSocket.ReceiveFromAsync(bufferMem, SocketFlags.None, _blankEndpoint);
Console.WriteLine(result);
}
catch (SocketException)
{
// Socket exception means we are finished.
break;
}
}
}
}
编写的接收器是一个背景服务,该后台服务在Net 6 Web应用程序中作为托管服务运行。
I have a udp sender and a receiver, when i connect these two directly with a random port say 9999 in my local machine, they both exchange messages. Now i want sender to send to a nginx load balencer, and the nginx load balancer should forward the udp stream to receiver. Now at the sender end i am sending data to port 9999. while at the receiver, i am listening to port 5000. And hence my nginx.conf is as follows.
stream{
upstream dns_servers {
least_conn;
server 127.0.0.1:5000;
}
server {
listen 9999 udp;
#UDP traffic will be forwarded to the "dns_servers" upstream group
proxy_pass dns_servers;
proxy_responses 1;
}
}
my nginx is running inside a docker and hence my 'docker-compose' file is as follows
version: '3.4'
services:
edsproxynginx:
image: nginx
extra_hosts:
- "host.docker.internal:127.0.0.1"
And my 'docker-compose-override.yml' file is as follows
version: '3.4'
services:
edsproxynginx:
container_name: edsproxynginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./logs/:/var/log/nginx/
- ./error/:/error/
restart: always
ports:
- "9999:9999/udp"
Now i start the nginx container, post which i start the receiver after that i start the sender. Now in error.log i get the following errors
2022/07/03 04:51:17 [error] 31#31: *49085 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49087 sendmsg() failed (111: Connection refused)
while proxying and sending to upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:2760/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49089 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49091 sendmsg() failed (111: Connection refused)
while proxying and sending to upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:2760/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49093 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49095 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49097 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
2022/07/03 04:51:17 [error] 31#31: *49099 recv() failed (111: Connection refused) while
proxying and reading from upstream, udp client: 172.27.0.1, server: 0.0.0.0:9999,
upstream: "127.0.0.1:5000", bytes from/to client:1380/0, bytes from/to upstream:0/1380
Am i missing something?
EDIT:
OK here is the sender and receiver source code snippet written in c#
Sender side code
using var udpSocket = new Socket(SocketType.Dgram, ProtocolType.Udp);
var userExitSource = GetUserConsoleCancellationSource();
var cancelToken = userExitSource.Token;
const int PacketSize = 1380;
// Discard our socket when the user cancels.
using var cancelReg = cancelToken.Register(() => udpSocket.Dispose());
IPAddress.TryParse("127.0.0.1", out var destination);
var ipEndPoint = new IPEndPoint(destination, 9999);
byte[] buffer = GC.AllocateArray<byte>(PacketSize, pinned: true);
Memory<byte> bufferMem = buffer.AsMemory();
// Put something approaching meaningful data in the buffer.
for (var idx = 0; idx < PacketSize; idx++)
{
bufferMem.Span[idx] = (byte)idx;
}
Console.WriteLine("Ready to send");
while (!cancelToken.IsCancellationRequested)
{
object value = await udpSocket.SendToAsync(bufferMem, SocketFlags.None, ipEndPoint, cancelToken);
Console.WriteLine("Sent to " + ipEndPoint.Port.ToString());
Thread.Sleep(1000);
}
Ans receiver side code
public class Listner : BackgroundService
{
private const int PacketSize = 1380;
private static readonly IPEndPoint _blankEndpoint = new IPEndPoint(IPAddress.Any, 5000);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Console.WriteLine("++++++++++++++++++");
using var udpSocket = new Socket(SocketType.Dgram, ProtocolType.Udp);
using var cancelReg = stoppingToken.Register(() => udpSocket.Dispose());
udpSocket.Bind(new IPEndPoint(IPAddress.Any, 5000));
Console.WriteLine("Bind successful");
await DoReceiveAsync(udpSocket, stoppingToken);
}
private async Task DoReceiveAsync(Socket udpSocket, CancellationToken cancelToken)
{
byte[] buffer = GC.AllocateArray<byte>(length: 65527, pinned: true);
Memory<byte> bufferMem = buffer.AsMemory();
while (!cancelToken.IsCancellationRequested)
{
try
{
var result = await
udpSocket.ReceiveFromAsync(bufferMem, SocketFlags.None, _blankEndpoint);
Console.WriteLine(result);
}
catch (SocketException)
{
// Socket exception means we are finished.
break;
}
}
}
}
Here the receiver is a background service that runs as a Hosted Service in a Net 6 Web application.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论