首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SocketAsyncEventArgs中的发送函数

SocketAsyncEventArgs中的发送函数
EN

Stack Overflow用户
提问于 2012-09-04 12:17:08
回答 1查看 1.4K关注 0票数 1

我正在处理一个C#客户机/服务器应用程序,并使用SocketAsyncEventArgs类。我可以从客户端发送消息,也可以在服务器上接收(并直接回答),但我不能从服务器“随意”发送。下面是我为发送而创建的一些代码,有人可以看到我的错误吗?如果您查看下面的代码,在我的handleSend中一切看起来都很好(消息看起来是对的,并且调用了t.Connection.SendAsync(completeArgs);,但是客户端没有显示任何内容.(除了我得到的直接答案.)

服务器代码:

代码语言:javascript
复制
    internal SocketListener(Int32 numConnections, Int32 bufferSize, Service1 parent)
{
try
{
 this.parent = parent;

 this.todo = new ArrayList();
 this.tokenPool = new ArrayList();
 this.numConnectedSockets = 0;
 this.numConnections = numConnections;
 this.bufferSize = bufferSize;
 this.readWritePool = new SocketAsyncEventArgsPool(numConnections);
 this.semaphoreAcceptedClients = new Semaphore(numConnections, numConnections);

 for (Int32 i = 0; i < this.numConnections; i++)
 {
  SocketAsyncEventArgs readWriteEventArg = new SocketAsyncEventArgs();
  readWriteEventArg.Completed += new EventHandler<SocketAsyncEventArgs> (OnIOCompleted);

  readWriteEventArg.SetBuffer(new Byte[this.bufferSize], 0, this.bufferSize);

  this.readWritePool.Push(readWriteEventArg);
 }
  Thread t = new Thread(handleSend);
  t.Start();
 }
 catch (Exception e)
 {
 }
}



public void handleSend()
{
 try
 {
 foreach (Token t in tokenPool)
  {
  if (t.ID != "" && t.ID != null)
   {
   if (parent.cStructHandler.gotMsg(t.ID))
        {
         MsgStruct tmpCs = parent.cStructHandler.getNextMsg(t.ID);
         if (tmpCs.getMsg().Length != 0)
         {
          byte[] ba = Encoding.UTF8.GetBytes(tmpCs.getMsg());
          if (tmpCs.getCrc() == "")
          {
           ulong tmp = CRC.calc_crc(ba, ba.Length);
           tmpCs.setCrc(tmp.ToString("X"));
          }
          if (tmpCs.canSendByTimeout())
          {
           string crcStr = "?" + tmpCs.getCrc() + "?";
           byte[] bb = Encoding.UTF8.GetBytes(crcStr);
           crcStr = Encoding.UTF8.GetString(bb);
           byte[] fullMsg = new byte[ba.Length + bb.Length];
           bb[0] = 254;
           bb[bb.Length - 1] = 255;
           ba.CopyTo(fullMsg, 0);
           bb.CopyTo(fullMsg, ba.Length);
           SocketAsyncEventArgs completeArgs = new SocketAsyncEventArgs();
           completeArgs.SetBuffer(fullMsg, 0, fullMsg.Length);
           completeArgs.UserToken = t;
           completeArgs.RemoteEndPoint = t.Connection.RemoteEndPoint;
           completeArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnIOCompleted);
           t.Connection.SendAsync(completeArgs);
          }
         }
        }
   }
  }

  Thread.Sleep(500);
  handleSend();
 }
 catch (Exception e)
 {
 }
}

客户代码:

代码语言:javascript
复制
private void OnReceive(object sender, SocketAsyncEventArgs e)
{
 Console.WriteLine("\nOnReceive: " +  System.Text.UTF8Encoding.ASCII.GetString(e.Buffer) + "\n");

 autoSendReceiveEvents[SendOperation].Set();
}
private void OnSend(object sender, SocketAsyncEventArgs e)
{
 // Signals the end of send.
 autoSendReceiveEvents[ReceiveOperation].Set();
 if (e.SocketError == SocketError.Success)
 {
  if (e.LastOperation == SocketAsyncOperation.Send)
  {

   Socket s = e.UserToken as Socket;
   byte[] receiveBuffer = new byte[255];
   e.SetBuffer(receiveBuffer, 0, receiveBuffer.Length);
   e.Completed += new EventHandler<SocketAsyncEventArgs>(OnReceive);
   s.ReceiveAsync(e);
  }
 }
 else
 {
  this.ProcessError(e);
 }
}
public void sendloop()
{
 try
 {
  byte[] data = new byte[1024];
  string input, stringData;


  bool gotData = true;
  lastTime = DateTime.Now;
  String bilId = ini.GetFromIni("CONFIG", "BIL");
  MsgStruct hello = new MsgStruct("I;1;" + bilId);

  while (gotData)
  {
   try
   {
        this.parent.isConnected = true;
        DateTime tmpDate = lastTime.AddSeconds(30);
        if (DateTime.Now > tmpDate)
        {

          gotData = false;
         }
         tmpDate = lastTime.AddSeconds(13);
         if (sendPing && DateTime.Now > tmpDate)
         {
           MsgStruct ping = new MsgStruct("X;" + DateTime.Now.ToLongTimeString() + ";" + Convert.ToString(this.parent.carPos.Y) + ";" + Convert.ToString(this.parent.carPos.X));
           ping.setAckNeeded(true);
           buffert.Add(ping);
           sendPing = false;
          }
          while (true)
          {
                if (canUseBuffert)
                {
                  canUseBuffert = false;
                  if (buffert.Count > 0)
                  {
                   if (buffert[0] != null && buffert[0].getMsg().Length != 0)
                   {
                          byte[] ba = Encoding.UTF8.GetBytes(buffert[0].getMsg());
                          if (buffert[0].getCrc() == "")
                          {
                                ulong tmp = CRC.calc_crc(ba, ba.Length);
                                buffert[0].setCrc(tmp.ToString("X"));
                           }
                           if (buffert[0].canSendByTimeout())
                           {
                                string crcStr = "?" + buffert[0].getCrc() + "?";
                                byte[] bb = Encoding.UTF8.GetBytes(crcStr);
                                crcStr = Encoding.UTF8.GetString(bb);
                                byte[] fullMsg = new byte[ba.Length + bb.Length];
                                bb[0] = 254;
                                bb[bb.Length - 1] = 255;
                                ba.CopyTo(fullMsg, 0);
                                bb.CopyTo(fullMsg, ba.Length);
                                string s = System.Text.UTF8Encoding.ASCII.GetString(fullMsg);

                                if(buffert[0].getMsg()[0] != 'X')


                           SocketAsyncEventArgs completeArgs = new SocketAsyncEventArgs();
                           completeArgs.SetBuffer(fullMsg, 0, fullMsg.Length);
                           completeArgs.UserToken = this.clientSocket;
                           completeArgs.RemoteEndPoint = this.hostEndPoint;
                           completeArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSend);
                           clientSocket.SendAsync(completeArgs);

                           AutoResetEvent.WaitAll(autoSendReceiveEvents);

                           Console.WriteLine( Encoding.ASCII.GetString(completeArgs.Buffer, completeArgs.Offset, completeArgs.BytesTransferred));

                           if (!buffert[0].isAckNeeded())
                                buffert.Remove(buffert[0]);


                          }
                         }
                        }
                        canUseBuffert = true;
                        break;
                   }
                  }
                 }
                 catch (Exception e)
                 {
                 }
                }
                Console.WriteLine("Disconnecting from server...");
           }
           catch (Exception e)
           {
                canUseBuffert = true;
           }
         }
EN

回答 1

Stack Overflow用户

发布于 2012-10-09 09:39:30

也许你应该试试这个https://stackoverflow.com/a/8933509/907732,这对我很有帮助。

可能会有格雷格·休吉尔描述的错误。

看看OnReceive(object发件人,SocketAsyncEventArgs e)

autoSendReceiveEventsSendOperation.Set()方法是接收结束的信号。因此,此代码将停止接收“在向缓冲区写入部分长度之后”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12263325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档