gpt4 book ai didi

重用套接字时 C# TCP Socket.Receive 问题

转载 作者:可可西里 更新时间:2023-11-01 02:43:04 26 4
gpt4 key购买 nike

前言:

我已经被这个困扰了一段时间,但我并没有找到我需要的东西。我有一个 C# (.NET 3.5) 服务。一个线程充当传入 TCP 连接的异步监听器。当数据进来时,我会产生一个新的工作线程来处理数据,并发回一个确认。

在同一服务的第二个线程上,我们发送命令,直到今天它会从数据库收集信息,构建一个新的套接字,连接然后发送命令,我正在使用 Socket.Receive 调用阻塞和等待响应(或直到发生超时)。

一切都很好,直到一个新的客户端需要以如此快的速度(5-10 秒间隔)向我们发送数据,以至于我们无法再打开一个新的套接字来获取命令。因此,我开始研究何时需要发送“监听器”线程已连接客户端的命令。如果该客户端当前已连接,则使用该套接字而不是创建新套接字。

问题:我已经到了可以在监听器接收到的同一个套接字上发送回命令的地步,但是当客户端将数据作为响应发送回时,Socket.Receive 方法需要两次才能真正触发认为它接收到数据。它第一次进入我的监听器类,第二次,在我真正希望它进入的命令类中。

问题:在调用我的 Socket.Receive 方法以确保数据到达正确位置之前,是否有一些选项或我需要做的事情?

在我的监听器类中,我有一个对象列表“CSocketPacket”

public class CSocketPacket
{
public CSocketPacket(System.Net.Sockets.Socket socket)
{
thisSocket = socket;
this.IpAddress =
((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
}

public System.Net.Sockets.Socket thisSocket;
public byte[] dataBuffer = new byte[BUFFER_SIZE];
public string IpAddress; //Use this to search for the socket
}

然后,当我发送命令时,我正在创建一个新的 TCP 套接字对象:

client = new Socket(
AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(
IPAddress.Parse(Strings.Trim(ipAddress)), port);
IPEndPoint LocalIp = new IPEndPoint(IPAddress.Parse(
System.Configuration.ConfigurationManager.AppSettings["SourceIP"]), port);

然后我正在查看我的监听器类列表以查看该套接字是否已连接:

if (listener.SocketExists(ipAddress)) 
{
// set the client socket in this class to the
// instance of the socket from the listener class
SocketIndex = listener.FindSocketInList(ipAddress);
if (SocketIndex != -1)
{
// might need to figure out how to avoid copying the socket
// to a new variable ???
client = listener.ConnectedSockets[SocketIndex].thisSocket;
SocketBeingReUsed = true;
}
}
else
{
// try to connect to the client
client.Connect(ep);
}

最后我完成了发送和接收的步骤

if (client.Connected)
{
if (client.Poll(1000, SelectMode.SelectWrite))
{
int sentAmount = Send(ref client);
client.ReceiveTimeout = 90000; //90 seconds
returnData = ReceiveData(ref client, sentAmount);
}
}

在我调用 Socket.Receive(data, total, Socket.ReceiveBufferSize, SocketFlags.None); 方法的 ReceiveData(ref client, sentAmount) 方法中一切正常。

我一直在使用一个名为 Hercules 的工具来测试在我的家庭网络上的两台机器之间发送/接收数据包。

有人知道我可以做些什么来解决这个问题吗?对于这么长的问题,我深表歉意,但我想尝试提供尽可能多的信息,而不是粘贴我的整个项目。我愿意提出任何建议。

免责声明:我在大约 3 年前写了这段代码,所以我在做一些我不应该做的事情,我敢肯定 :P

感谢所有阅读本文的人。

此致

克里斯

最佳答案

好的,现在我要跟进了!鉴于您在上面的评论中所说的,那么解决问题的方法是有一个从套接字读取的类/线程(无论如何这是从套接字读取的正确方法),然后它将协调哪个类获取数据。我认为它可能有点像 Command Design Pattern .

关于重用套接字时 C# TCP Socket.Receive 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761132/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com