c# AsyncSockets,在没有接收数据之前发送数据
本文关键字:数据 AsyncSockets | 更新日期: 2023-09-27 18:04:28
我是套接字编程的新手(特别是asyncsockets)。
我使用这个教程http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class获得一个AsynSocketserver
(我的客户端使用同步套接字)
基本上是有效的。客户端可以连接到服务器,发送一些数据并得到回显。
我有这个代码(在SocketListener
类中)来接收数据(没有echo):
private void ProcessReceive(SocketAsyncEventArgs e) {
//check if remote host closed the connection
if (e.BytesTransferred > 0) {
if (e.SocketError == SocketError.Success) {
Token token = e.UserToken as Token;
token.SetData(e);
Socket s = token.Connection;
if (s.Available == 0) {
token.ProcessData(e);
}
bool IOPending = s.ReceiveAsync(e);
if (!IOPending) {
ProcessReceive(e);
}
//echo back
/* if (s.Available == 0) {
//set return buffer
token.ProcessData(e);
if (!s.SendAsync(e)) {
this.ProcessSend(e);
}
} else if (!s.ReceiveAsync(e)) {
this.ProcessReceive(e);
}*/
} else {
this.ProcessError(e);
}
} else {
this.CloseClientSocket(e);
}
}
private void ProcessSend(SocketAsyncEventArgs e) {
if(e.SocketError == SocketError.Success){
Token token = e.UserToken as Token;
if(!token.Connection.ReceiveAsync(e)){
this.ProcessReceive(e);
}
} else {
this.ProcessError(e);
}
}
现在我希望客户端可以连接到服务器(可能发送一些数据到服务器,但它不应该是必要的,客户端首先发送一些数据到服务器,它只需要连接到服务器),客户端可以从服务器接收一些数据。
问题:我不知道在哪里或如何使用socketEventArgs.senAsync()-方法之前没有接收数据。
目前我在token类中使用send()方法,它创建了一个新的AsyncEventArgs对象,并使用(在令牌中)存储的连接来发送数据:
public void send() {
SocketAsyncEventArgs args = new SocketAsyncEventArgs();
args.UserToken = this;
args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
connection.SendAsync(args);
}
它工作,但这似乎是错误的方法。
那么,在没有从客户端接收数据的情况下,如何在打开连接的情况下向客户端发送数据呢?
对我来说,唯一"错误"的地方是您没有检查SendAsync
的返回值(它可以同步返回,特别是在失败的情况下)-并且您没有Completed
事件订阅,因此当同步或异步时,您将无法检测到失败。此外,可能(当然也是可取的)重用SocketAsyncEventArgs
实例,而不是每次发送都新建一个。
但基本上:很好。你可以在任何时候发送,真的。