public IEnumerator sendCoroutine(NetworkInterface networkInterface, uint fId, PacketHolder par) { fini(true); Debug.Log("message Number " + streamList.Count); bool resp = false; if (networkInterface.valid()) { for (int i = 0; i < streamList.Count; i++) { stream = streamList[i]; networkInterface.send(stream.getbuffer(), delegate(Packet p) { par.packet = p; resp = true; }, fId); Log.Sys("SendNetworkSuc"); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } streamList.Clear(); stream = new MemoryStream(); while (!resp) { yield return(null); } }
private void _asyncReceive() { if (_networkInterface == null || !_networkInterface.valid()) { Dbg.WARNING_MSG("PacketReceiver::_asyncReceive(): network interface invalid!"); return; } var socket = _networkInterface.sock(); while (true) { // 必须有空间可写,否则我们阻塞在线程中直到有空间为止 int first = 0; int space = _free(); while (space == 0) { if (first > 0) { if (first > 1000) { Dbg.ERROR_MSG("PacketReceiver::_asyncReceive(): no space!"); Event.fireIn("_closeNetwork", new object[] { _networkInterface }); return; } Dbg.WARNING_MSG("PacketReceiver::_asyncReceive(): waiting for space, Please adjust 'RECV_BUFFER_MAX'! retries=" + first); System.Threading.Thread.Sleep(5); } first += 1; space = _free(); } int bytesRead = 0; try { bytesRead = socket.Receive(_buffer, _wpos, space, 0); } catch (SocketException se) { Dbg.ERROR_MSG(string.Format("PacketReceiver::_asyncReceive(): receive error, disconnect from '{0}'! error = '{1}'", socket.RemoteEndPoint, se)); Event.fireIn("_closeNetwork", new object[] { _networkInterface }); return; } if (bytesRead > 0) { // 更新写位置 Interlocked.Add(ref _wpos, bytesRead); } else { Dbg.WARNING_MSG(string.Format("PacketReceiver::_asyncReceive(): receive 0 bytes, disconnect from '{0}'!", socket.RemoteEndPoint)); Event.fireIn("_closeNetwork", new object[] { _networkInterface }); return; } } }
public void send(NetworkInterface networkInterface) { fini(true); if (networkInterface.valid()) { for (int i = 0; i < streamList.Count; i++) { stream = streamList[i]; networkInterface.send(stream.getbuffer()); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } // 把不用的MemoryStream放回缓冲池,以减少垃圾回收的消耗 for (int i = 0; i < streamList.Count; ++i) { streamList[i].reclaimObject(); } streamList.Clear(); stream.clear(); // 我们认为,发送完成,就视为这个bundle不再使用了, // 所以我们会把它放回对象池,以减少垃圾回收带来的消耗, // 如果需要继续使用,应该重新Bundle.createObject(), // 如果外面不重新createObject()而直接使用,就可能会出现莫名的问题, // 仅以此备注,警示使用者。 Bundle.reclaimObject(this); }
void _asyncSend() { if (_networkInterface == null || !_networkInterface.valid()) { Dbg.WARNING_MSG("PacketSender::_asyncSend(): network interface invalid!"); return; } var socket = _networkInterface.sock(); while (true) { Monitor.Enter(_sendingObj); int sendSize = _wpos - _spos; int t_spos = _spos % _buffer.Length; if (t_spos == 0) { t_spos = sendSize; } if (sendSize > _buffer.Length - t_spos) { sendSize = _buffer.Length - t_spos; } int bytesSent = 0; try { bytesSent = socket.Send(_buffer, _spos % _buffer.Length, sendSize, 0); } catch (SocketException se) { Dbg.ERROR_MSG(string.Format("PacketSender::_asyncSend(): send data error, disconnect from '{0}'! error = '{1}'", socket.RemoteEndPoint, se)); Event.fireIn("_closeNetwork", new object[] { _networkInterface }); Monitor.Exit(_sendingObj); return; } _spos += bytesSent; // 所有数据发送完毕了 if (_spos == _wpos) { _sending = false; Monitor.Exit(_sendingObj); return; } Monitor.Exit(_sendingObj); } }
static int valid(IntPtr L) { try { ToLua.CheckArgsCount(L, 1); KBEngine.NetworkInterface obj = (KBEngine.NetworkInterface)ToLua.CheckObject <KBEngine.NetworkInterface>(L, 1); bool o = obj.valid(); LuaDLL.lua_pushboolean(L, o); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
public void send(NetworkInterface networkInterface) { fini(true); if (networkInterface.valid()) { for (int i = 0; i < streamList.Count; i++) { stream = streamList[i]; networkInterface.send(stream.getbuffer()); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } streamList.Clear(); stream = new MemoryStream(); }
public void send(NetworkInterface networkInterface) { fini(true); if(networkInterface.valid()) { for(int i=0; i<streamList.Count; i++) { stream = streamList[i]; networkInterface.send(stream.getbuffer()); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } streamList.Clear(); stream = new MemoryStream(); }
public void send(NetworkInterface networkInterface) { fini(true); if (networkInterface.valid()) { for (int i = 0; i < streamList.Count; i++) { MemoryStream tempStream = streamList[i]; networkInterface.send(tempStream); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } // 我们认为,发送完成,就视为这个bundle不再使用了, // 所以我们会把它放回对象池,以减少垃圾回收带来的消耗, // 如果需要继续使用,应该重新Bundle.createObject(), // 如果外面不重新createObject()而直接使用,就可能会出现莫名的问题, // 仅以此备注,警示使用者。 reclaimObject(); }
void sendImm(NetworkInterface networkInterface, uint fId) { fini(true); Debug.Log("message Number " + streamList.Count); //bool resp = false; if (networkInterface.valid()) { for (int i = 0; i < streamList.Count; i++) { stream = streamList[i]; networkInterface.send(stream.getbuffer(), delegate(Packet p) { //par.packet = p; //resp = true; }, fId); } } else { Dbg.ERROR_MSG("Bundle::send: networkInterface invalid!"); } streamList.Clear(); stream = new MemoryStream(); }