gpt4 book ai didi

c# - 为什么即使我的服务器套接字已经收到所有字节,SendAsync也不在SocketAsyncEventArgs上引发Completed事件?

转载 作者:行者123 更新时间:2023-12-03 11:52:52 26 4
gpt4 key购买 nike

因此,我有一个非常简单的设置:WAITING客户端连接的服务器和连接服务器并发送消息的客户端。之后,服务器应再次发送相同的消息。但是,当我尝试使用 client.SendAsync(sendArgs)发送消息时,即使我看到服务器套接字已经接收到所有字节,它实际上也没有在sendArgs对象上调用Completed Event。那么,为什么我的客户端套接字 中的 sendArgs.Completed 没有提高,而我的 Server-Socket 类中的 receiveArgs.Completed 呢?

使用的命名空间:System,System.Net,System.Net,System.Text

到目前为止,这是我的代码:

客户

public class SocketClient
{
public IPEndPoint Endpoint { get; }

private Socket client;

public SocketClient(IPAddress address, int port)
{
Endpoint = new IPEndPoint(address, port);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}

public void ConnectToServer(IPAddress serverAddress, int serverPort)
{
client.Bind(Endpoint);

try
{
client.Connect(serverAddress, serverPort);
}
catch (SocketException)
{
return;
}
}

public void SendMessage(string message)
{
SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
byte[] buffer = Encoding.ASCII.GetBytes(message);
sendArgs.SetBuffer(buffer, 0, buffer.Length);
sendArgs.Completed += SendArgs_Completed;
client.SendAsync(sendArgs);
}

private void SendArgs_Completed(object sender, SocketAsyncEventArgs e)
{
SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
byte[] buffer = new byte[1024];
receiveArgs.SetBuffer(buffer, 0, buffer.Length);
receiveArgs.Completed += ReceiveArgs_Completed;
client.ReceiveAsync(receiveArgs);
}

private void ReceiveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
string message = Encoding.ASCII.GetString(e.Buffer);
Console.WriteLine(message);
}
}

服务器
public class SocketServer
{
public IPEndPoint Endpoint { get; }

private Socket server;

public SocketServer(IPAddress address, int port)
{
Endpoint = new IPEndPoint(address, port);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}

public void Start()
{
server.Bind(Endpoint);
server.Listen(10);

SocketAsyncEventArgs acceptArgs = new SocketAsyncEventArgs();
acceptArgs.Completed += AcceptArgs_Completed;
server.AcceptAsync(acceptArgs);
}

private void AcceptArgs_Completed(object sender, SocketAsyncEventArgs e)
{
Socket connectionSocket = e.AcceptSocket;

SocketAsyncEventArgs receiveArgs = new SocketAsyncEventArgs();
byte[] buffer = new byte[1024];
receiveArgs.SetBuffer(buffer, 0, buffer.Length);
receiveArgs.Completed += ReceiveArgs_Completed;
connectionSocket.ReceiveAsync(receiveArgs);

e.AcceptSocket = null;
server.AcceptAsync(e);
}

private void ReceiveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
Socket connectionSocket = (Socket)sender;

SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
sendArgs.SetBuffer(e.Buffer, 0, e.Buffer.Length);
connectionSocket.SendAsync(sendArgs);

connectionSocket.ReceiveAsync(e);
}
}

最佳答案

编辑:我修复了它。我所缺少的是检查 SendAsync 方法是否已同步或异步完成。如果同步完成,我需要自己调用该事件

bool completedAsync = client.SendAsync(sendArgs);
if(!completedAsync)
{
SendArgs_Completed(this, sendArgs);
}

关于c# - 为什么即使我的服务器套接字已经收到所有字节,SendAsync也不在SocketAsyncEventArgs上引发Completed事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661223/

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