C#接收异步错误
我正在开发一个应用服务器。我想使用同步方法。调用ReceiveAsync方法时出现错误“对象引用未设置为对象的实例”。如果有人提出这个问题并找到了解决办法C#接收异步错误,c#,C#,我正在开发一个应用服务器。我想使用同步方法。调用ReceiveAsync方法时出现错误“对象引用未设置为对象的实例”。如果有人提出这个问题并找到了解决办法 public class AppServer { public void Start() { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); se
public class AppServer
{
public void Start()
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12345));
serverSocket.Listen(100);
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
bool raiseEvent = serverSocket.AcceptAsync(e);
if (!raiseEvent)
AcceptCallback(e);
}
void e_Completed(object sender, SocketAsyncEventArgs e)
{
AcceptCallback(e);
}
private void AcceptCallback(SocketAsyncEventArgs e)
{
SocketAsyncEventArgs readEventArgs = new SocketAsyncEventArgs();
readEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(readEventArgs_Completed);
Socket clientSocket = e.AcceptSocket;
bool raiseEvent = clientSocket.ReceiveAsync(readEventArgs); // <-- Error goes here
if (!raiseEvent)
ReceiveCallback(readEventArgs);
}
void readEventArgs_Completed(object sender, SocketAsyncEventArgs e)
{
ReceiveCallback(e);
}
private void ReceiveCallback(SocketAsyncEventArgs e)
{
}
}
公共类AppServer
{
公开作废开始()
{
Socket serverSocket=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Any,12345));
serverSocket.Listen(100);
SocketAsyncEventArgs e=新的SocketAsyncEventArgs();
e、 已完成+=新事件处理程序(e_已完成);
bool raiseEvent=serverSocket.acceptsync(e);
如果(!raiseEvent)
接受(e);
}
无效e_已完成(对象发送方,SocketAsyncEventArgs e)
{
接受(e);
}
私有void AcceptCallback(SocketAsyncEventArgs e)
{
SocketAsyncEventArgs readEventArgs=新的SocketAsyncEventArgs();
readEventArgs.Completed+=新的事件处理程序(readEventArgs\u Completed);
Socket clientSocket=e.AcceptSocket;
bool raiseEvent=clientSocket.ReceiveAsync(readEventArgs);//我不确定为什么要在两个位置接受套接字。如果删除
AcceptCallback(e);
从e_完成,一切正常
它是指向示例异步服务器的链接:
我也有同样的问题,我设法解决了。
在调用ReceiveAsync(e)之前,您需要为SocketAsyncEventArgs对象提供一个数据缓冲区(字节数组)来存储接收到的数据
我假设,如果在该行上放置断点,那么clientSocket(以及e.AcceptSocket)是空的吗?e.SocketError返回什么?我能够重现问题,并且clientSocket
不是null
,我无法找出它。盲目地把东西拉出来,直到它工作为止,对于软件来说不是一个好方法。如果您尝试理解错误的原因并修复它,这将是一个好方法。在这里,代码正在尝试接收错误来自异步套接字的数据,无需首先分配和分配接收缓冲区。这是应该解决的问题。
void e_Completed(object sender, SocketAsyncEventArgs e)
{
byte[] buffer = new byte[1024];
e.SetBuffer(buffer, 0, buffer.Length);
AcceptCallback(e);
}