我正在开发一个低延迟的财务应用程序,它通过套接字接收tcp数据 这就是我如何建立套接字并接收字节:
public class IncomingData
{
Socket _Socket;
byte[] buffer = new byte[4096];
public static void Connect(IPEndPoint endPoint)
{
_Socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_Socket.Connect(endPoint);
}
public static void ReadSocket(int ReadQty)
{
_Socket.Receive(buffer, 0, ReadQty, SocketFlags.None);
}
}
我听说当你在Stream套接字上调用Receive()
时,调用线程进入休眠状态,并在收到数据时被唤醒。我希望线程以全速运行(使用CPU容量)。
有没有办法可以使用Stream套接字执行此操作?如果唯一的方法是使用Raw套接字,你能提供一个例子吗?
答案 0 :(得分:1)
如果我理解正确,你希望接收不阻止?
查看套接字类的BeginX
/ EndX
方法。这些方法异步执行(不阻塞当前线程)。它们接受回调方法作为其参数之一,并且在操作完成时将调用该方法(在这种情况下,将接收数据)。它与事件基本相同。
public class IncomingData
{
Socket _Socket;
byte[] buffer = new byte[4096];
public static void Connect(IPEndPoint endPoint)
{
_Socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_Socket.Connect(endPoint);
}
public static void ReadSocket(int ReadQty)
{
// Wait for some data to be received. When data is received,
// ReceiveCallback will be called.
_Socket.BeginReceive(buffer, 0, ReadQty, SocketFlags.None, ReceiveCallback, null);
}
private static void ReceiveCallback(IAsyncResult asyncResult)
{
int bytesTransferred = _Socket.EndReceive(asyncResult);
// ...
// process the data
// ...
}
}
答案 1 :(得分:1)
您可以使用Socket.Poll
来确定套接字是否有数据,否则继续旋转:
// will spin here until poll returns true
while(!socket.Poll(0, SelectMode.SelectRead));
socket.Receive...
答案 2 :(得分:0)
或许通过查看networkComms.net并特别是展示最基本功能here的简短示例,通过网络发送数据的整个问题,希望不要过于复杂!您可能遇到的大多数问题已经解决,可能会为您节省一些时间。