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);
    }

它工作,但这似乎是错误的方法。

那么,在没有从客户端接收数据的情况下,如何在打开连接的情况下向客户端发送数据呢?

c# AsyncSockets,在没有接收数据之前发送数据

对我来说,唯一"错误"的地方是您没有检查SendAsync的返回值(它可以同步返回,特别是在失败的情况下)-并且您没有Completed事件订阅,因此当同步或异步时,您将无法检测到失败。此外,可能(当然也是可取的)重用SocketAsyncEventArgs实例,而不是每次发送都新建一个。

但基本上:很好。你可以在任何时候发送,真的。