【问题标题】:C# AsyncSockets, where to send data without receiveing data before?C# Async Sockets,在哪里发送数据而不接收数据?
【发布时间】:2014-07-08 22:25:45
【问题描述】:

我是套接字编程的新手(尤其是异步套接字)。

我使用本教程http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class 获得了AsynSocketserver(我的客户端使用同步套接字)

基本上它有效。客户端可以连接到服务器,发送一些数据并得到回显。

我有这个代码(在SocketListener 类中)来接收数据(没有回显):

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-Class 中使用 send() 方法,它创建一个新的 AsyncEventArgs 对象并使用(在令牌中)存储的连接来发送数据:

      public void send() {
        SocketAsyncEventArgs args = new SocketAsyncEventArgs();

        args.UserToken = this;
        args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
        connection.SendAsync(args);

    }

它有效,但这似乎是错误的方法。

那么,如何在不先从客户端接收数据的情况下,通过打开的连接向客户端发送数据?

【问题讨论】:

    标签: c# sockets send asyncsocket


    【解决方案1】:

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

    但从根本上说:很好。你可以随时发送,真的。

    【讨论】:

    • 通过重用 SocketAsyncEventArgs 实例,您的意思是重用用于接收数据的实例或在每次发送时重用的我的令牌类中创建全局实例?因为通过重用接收到数据的实例,我得到一个“System.InvalidOperationException”,因为该实例被设置为再次接收数据/侦听数据。
    • @Rul3r 用于发送和接收的单独参数
    猜你喜欢
    • 2013-02-15
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多