2012-09-04 23 views
1

我正在研究C#客戶端/服務器應用程序並使用SocketAsyncEventArgs類。我可以從客戶端發送消息,並且可以通過服務器接收消息(並直接回復),但我無法從服務器「隨意」發送消息。以下是我爲發送創建的一些代碼,是否有任何人可以看到我的錯誤?如果你看下面的代碼,我的handleSend中的一切看起來都很好(消息看起來是正確的,並且t.Connection.SendAsync(completeArgs);被調用,但在客戶端沒有任何顯示......(除了直接回答I得到...)在SocketAsyncEventArgs中發送函數

服務器代碼:

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

客戶端代碼:

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

回答

1

也許你應該試試這個https://stackoverflow.com/a/8933509/907732 這對我很有幫助

Greg Hewgill可能會描述一個錯誤。

的onReceive(對象發件人,的SocketAsyncEventArgs E)

autoSendReceiveEvents [SendOperation] .SET()方法的信號的接收的結束。因此,此代碼在部分長度已被寫入緩衝區後停止接收「」。