日期:2014-05-18 浏览次数:21227 次
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Runtime.InteropServices;
namespace nsqserver
{
    [StructLayout(LayoutKind.Sequential)]
    public struct SendSegment
    {
        byte[] sendbuffer;
        SendPacketsElement[] sendelements;
        int offset;
        int count;
        public SendSegment(SendPacketsElement[] elements)
        {
            sendelements = elements;
            sendbuffer = null;
            offset = 0;
            count = 0;
        }
        public SendSegment(byte[] buffer, int ost, int cot)
        {
            sendbuffer = buffer;
            sendelements = null;
            offset = ost;
            count = cot;
        }
        public byte[] SendBuffer { get { return this.sendbuffer; } }
        public SendPacketsElement[] SendElments { get { return this.sendelements; } }
        public int Offset { get { return this.offset; } }
        public int Count { get { return this.count; } }
    }
    public enum RecvHasHeaders
    {
        On,
        Off
    }
    class SocketServer
    {
        byte[] buffers;
        byte[] sendbuffer;
        Socket[] sockets;
        SocketAsyncEventArgs[] sendargs;
        SocketAsyncEventArgs[] recvargs;
        SocketAsyncEventArgs[] acepargs;
        Queue<SendSegment>[] queues;
        Object[] objs;
        int recvbufferlen;
        int sockcount;
        int sendbufferlen;
        int sendindex;
        Object stackobj = new Object();
        RecvHasHeaders[] recvhasheader;
        Socket acceptsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        public event Func<int, byte[], int, int, int> RecvByteComplete;
        public event Func<int, byte[], int, int, int> RecvNoHeaderComplete;
        public event Action<int> SendPacketsComplete;
        public event Action<int> AcceptComplete;
        public event Action<int> SendComplete;
        public event Action<int> CloseComplete;
        byte[] inValue = new byte[] { 1, 0, 0, 0, 0x88, 0x13, 0, 0, 0x88, 0x13, 0, 0 };
        public SocketServer(int skcount, int rvbufferlen, int sdbufferlen, int queuecount, string ipadr, int port)
        {
            buffers = new byte[skcount * rvbufferlen];
            sendbufferlen = sdbufferlen;
            sendindex = 0;
            sendbuffer = new byte[sdbufferlen];
            sockets = new Socket[skcount];
            sendargs = new SocketAsyncEventArgs[skcount];
            recvargs = new SocketAsyncEventArgs[skcount];
            acepargs = new SocketAsyncEventArgs[skcount];
            queues = new Queue<SendSegment>[skcount];
            objs = new Object[skcount];
            recvhasheader = new RecvHasHeaders[skcount];
            recvbufferlen = rvbufferlen;
            sockcount = skcount;
            acceptsock.Bind(new IPEndPoint(IPAddress.Parse(ipadr), port));
            acceptsock.Listen(100);
            for (int i = 0; i < skcount; i++)
            {
                sockets[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sendargs[i] = new SocketAsyncEventArgs();
                sendargs[i]