private void genPackages() { PackageBuffer pkgBuffer = new PackageBuffer(); requestMissing(pkgBuffer); replyRequest(pkgBuffer); sendMessages(pkgBuffer); if (pkgBuffer.len == 0) { if (heartbeat_tick == 0) { packHeartbeat(pkgBuffer); heartbeat_tick = HEARTBEAT_INTERVAL; } else { heartbeat_tick--; } } if (pkgBuffer.len > 0) { pkg_queue.Add(pkgBuffer); } }
public ConnectionWorker(Connection conn) { this.conn = conn; readBuffer = new PackageBuffer(); writeBuffer = new PackageBuffer(); stop = false; }
private void replyRequest(PackageBuffer pkgBuffer) { for (int i = 0; i < request_queue.Count; ++i) { int id = request_queue[i]; int index = -1; for (int j = 0; j < history_queue.Count; ++j) { if (id < history_queue[j].id) { break; } else if (id == history_queue[j].id) { index = j; break; } } if (index == -1) // expired { crashed = true; } else { packMessage(history_queue[index], pkgBuffer); } } request_queue.Clear(); }
private void packHeartbeat(PackageBuffer pkgBuffer) { if (pkgBuffer.len == PackageBuffer.PACKAGE_LEN) { pkg_queue.Add(pkgBuffer); pkgBuffer = new PackageBuffer(); } pkgBuffer.buffer[pkgBuffer.len++] = (byte)TYPE_HEARTBEAT; }
private void packRequest(PackageBuffer pkgBuffer, int id) { if ((PackageBuffer.PACKAGE_LEN - pkgBuffer.len) < 3) { pkg_queue.Add(pkgBuffer); pkgBuffer = new PackageBuffer(); } pkgBuffer.len = fillHeader(pkgBuffer.buffer, pkgBuffer.len, TYPE_REQUEST, id); }
private void sendMessages(PackageBuffer pkgBuffer) { int i = 0; for (; i < send_queue.Count; ++i) { if ((send_queue[i].tick + send_delay) > curr_tick) { break; } packMessage(send_queue[i], pkgBuffer); history_queue.Add(send_queue[i]); } send_queue.RemoveRange(0, i); }
private void packMessage(Message msg, PackageBuffer pkgBuffer) { int lenData = msg.data.Length; int lenPackage = (lenData < 128) ? lenData + 3 : lenData + 4; if ((PackageBuffer.PACKAGE_LEN - pkgBuffer.len) < lenPackage) { pkg_queue.Add(pkgBuffer); pkgBuffer = new PackageBuffer(); } pkgBuffer.len = fillHeader(pkgBuffer.buffer, pkgBuffer.len, lenData + TYPE_DATA, msg.id); Array.Copy(msg.data, 0, pkgBuffer.buffer, pkgBuffer.len, lenData); pkgBuffer.len += lenData; }
private void requestMissing(PackageBuffer buffer) { int id = recv_id_min; for (int i = 0; i < recv_queue.Count; ++i) { if (recv_queue[i].id > id) { for (int j = id; j < recv_queue[i].id; j++) { packRequest(buffer, j); } } id = recv_queue[i].id + 1; } }
public virtual bool Decode(TCPSession session, PackageBuffer buffer, ProtocolDecoderOutput output) { return(false); }