// 연결되었다면 token값 할당. 아니라면 token == null public int ConnectToLogin(string id, string pw, out string token) { // todo // id, pw를 로그인서버로 검증받아서 token을 받는다. // 결과로 온 연결 실패 값에 따라 다른 명령 처리할 것. byte[] buffer = new byte[1024]; int datasize = 0; int result = 0; token = null; CruMessage msg = new CruMessage(CruNetworkProtocol.MSG_TYPE.LOGIN_REQUEST, new object[2] { (string)id, (string)pw }); // 로그인 요청할 데이터 세팅 datasize = _messageTransfer.SingleMsgToSendData(msg, buffer, 0, buffer.Length); //byte[] buffer = _messageTransfer.DatasToByte(CruNetworkProtocol.MSG_TYPE.LOGIN_REQUEST, datas); // 로그인 서버 포트로 연결할 것 Socket client = Connect("localhost", 8080); if (client == null) { return(-1); } // 로그인 정보 전달. client.Send(buffer, 0, datasize, SocketFlags.None); Array.Clear(buffer, 0, buffer.Length); datasize = client.Receive(buffer, 0, buffer.Length, SocketFlags.None); CruMessage[] receivemsg = _messageTransfer.ReceiveByteToMsgs(buffer, datasize); result = (short)receivemsg[0].Datas[0]; if (result == 0) { token = (string)receivemsg[0].Datas[1]; } return(result); }
// 일단 한 번에 여러 명령이 올 수 있다는 가정하에 작성. // Receive 받고, 함수를 통해 정보를 다른 곳으로 보내줘야한다. // Receive된 정보를 바꾸는 걸 비동기화로 바꾸면 좋을 듯. // Receive된 정보를 해당 쓰레드 말고 중앙으로 줘서 처리할 수 있지만, 그러면 중앙에서 모든 Client에서 온 정보를 처리해야하기에 각각 Thread에서 처리해주는게 더 빠르다. public bool Receive() { CruMessage[] temp; try { _receiveDataSize = _client.Receive(_receiveBuffer, 1024, SocketFlags.None); if (_receiveDataSize == 0) { throw new SocketException(); } // temp = _transfer.ByteToMsgs(_receiveBuffer, 0, _receiveDataSize); temp = _transfer.ReceiveByteToMsgs(_receiveBuffer, _receiveDataSize); } catch (SocketException e) { Console.WriteLine(e); if (TerminateThread() == true) { if (disconnectEvent != null) { disconnectEvent(_clientNum); } } return(false); } catch (ObjectDisposedException e) { Console.WriteLine(e); if (TerminateThread() == true) { if (disconnectEvent != null) { disconnectEvent(_clientNum); } } return(false); } receiveCompleteCommonEvent(temp, _clientNum); return(true); }