none
Socket통신중에 서버에서 클라이언트(WP)으로 패킷을 보낼때 클라이언트에서 어떻게 받아야 할지 모르겠어요. RRS feed

  • 질문

  • 제가 현재 클라이언트(WP)에러 서버로 자료를 전송하는 것은 성공했거든요.
     
    클라이언트에서 버튼을 누르면 서버에 패킷이 가고 그것에 맞는 메세지창이 떠서 실행을 하거든요.
     
    그런데 서버에서 클라이언트로 어떻게 보내야할지 모르겠어요.
     
    클라이언트에서 recieve를 계속 열어 놓으라고 하는데 타이머때문에 자꾸 패킷이 null로 뜨고 계속열려고 타이머를 없애면 오류가 떠버리네요..
     
    아래 소스를 보시면 recieve를 계속 열어놓기 위해서  로그인을할때든가 자료를 전송할때 혹은 자료를 전송하고 받을때
    recieve() 명령어를 추가했거든요.
    그런데 타이머때문에  NullReferenceException오류가 뜨고 received가 null로 오거든요.
     
    제가 하려는 것은 클라이언트가 로그인되있는 상태에서 서버에서 클라이언트로 자료를 보낼때 먼저 서버에서 패킷을 보내면 클라이언트에서 그 패킷을 받으려고 하거든요..
     
    어떻게 처리해야 할지 막막하네요..
     
    public class SocketLibrary
        {
            Socket s = null;
            static ManualResetEvent done = new ManualResetEvent(false);
            public bool EstablishTCPConnection(string host, int port)
            {
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = new DnsEndPoint(host, port);
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object o, SocketAsyncEventArgs e)
                    {
                        done.Set();
                        Receive();
                    });
                done.Reset();
                s.ConnectAsync(socketEventArg);
                return done.WaitOne(100000);
            }
            public bool Send(byte[] data)                             // 패킷보냄
            {
                if (s != null)
                {
                    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                    socketEventArg.RemoteEndPoint = s.RemoteEndPoint;
                    socketEventArg.UserToken = null;
                    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object o, SocketAsyncEventArgs e)
                        {
                            done.Set();
                            Receive();
                        });
                    socketEventArg.SetBuffer(data,0,data.Length);
                    done.Reset();
                    s.SendAsync(socketEventArg);
                    return done.WaitOne(10000);
                }
                return false;
            }
     
            public string Receive()                                       // 패킷받음
            {
                byte[] received = null;
                string result="";
                if (s != null)
                {
                    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                    socketEventArg.RemoteEndPoint = s.RemoteEndPoint;
                    socketEventArg.SetBuffer(new byte[1024], 0, 1024);
                    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object o, SocketAsyncEventArgs e)
                    {
                        socketEventArg.SetBuffer(e.Buffer, 0, e.Buffer.Length);
                        if (e.SocketError == SocketError.Success)
                        {
                            received = e.Buffer;
                        }
                        done.Set();
                        Receive();
                    });
                    done.Reset();
                    s.ReceiveAsync(socketEventArg);
                    done.WaitOne(10000);
                    return received;
              }
    }

    2012년 8월 2일 목요일 오후 2:48

모든 응답