// 시작 버튼 private void BeginStartServer(object sender, EventArgs e) { for (int i = 0; i < problem.Length; i++) { AppendText(txtHistory, string.Format("{0}", problem[i])); } int port; if (!int.TryParse(txtPort.Text, out port)) { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } if (mainSock.IsBound) { MsgBoxHelper.Warn("서버가 실행중입니다."); return; } IPEndPoint serverEP = new IPEndPoint(thisAddress, port); mainSock.Bind(serverEP); mainSock.Listen(10); mainSock.BeginAccept(AcceptCallback, null); AppendText(txtHistory, string.Format("서버가 실행되었습니다.")); }
void BeginStartServer(object sender, EventArgs e) { int port; if (!int.TryParse(txtPort.Text, out port)) //문자열을 int port로 변환 { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } thisAddress = IPAddress.Parse(txtAddress.Text); if (thisAddress == null) {// 로컬호스트 주소를 사용한다. thisAddress = IPAddress.Loopback; txtAddress.Text = thisAddress.ToString(); } // 서버에서 클라이언트의 연결 요청을 대기하기 위해 // 소켓을 열어둔다. IPEndPoint serverEP = new IPEndPoint(thisAddress, port); mainSock.Bind(serverEP); mainSock.Listen(10); AppendText(txtHistory, string.Format("서버 시작: @{0}", serverEP)); // 비동기적으로 클라이언트의 연결 요청을 받는다. mainSock.BeginAccept(AcceptCallback, null); }
void BeginStartServer(object sender, EventArgs e) { int port; if (!int.TryParse(txtPort.Text, out port)) { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } IPHostEntry he = Dns.GetHostEntry(Dns.GetHostName()); // 처음으로 발견되는 ipv4 주소를 사용한다. foreach (IPAddress addr in he.AddressList) { if (addr.AddressFamily == AddressFamily.InterNetwork) { //AppendText(txtHistory, addr.ToString()); string[] ip = addr.ToString().Split('.'); // ! A, B, C 클래스 제외 if (ip[0].Equals("172") || ip[0].Equals("192") || ip[0].Equals("10") || ip[0].Equals("169") || ip[0].Equals("127") || ip[0].Equals("0") || ip[0].Equals("224") || ip[0].Equals("240") || ip[0].Equals("239") || (ip[0].Equals("192") && ip[1].Equals("168")) || (ip[0].Equals("172") && Convert.ToInt32(ip[1]) >= 16 && Convert.ToInt32(ip[1]) <= 31)) { //AppendText(txtHistory, "포함"); } else { thisAddress = IPAddress.Parse(addr.ToString()); } } } // 서버에서 클라이언트의 연결 요청을 대기하기 위해 // 소켓을 열어둔다. IPEndPoint serverEP = new IPEndPoint(thisAddress, serverPort); udpSock.Bind(serverEP); mainSock.Bind(serverEP); mainSock.Listen(10); AppendText(txtHistory, string.Format("서버 시작: @{0}", serverEP)); AppendText(txtAddress, thisAddress.ToString()); // 비동기적으로 클라이언트의 연결 요청을 받는다. //udpSock.BeginAccept(AcceptCallback, null); mainSock.BeginAccept(AcceptCallback, null); }
void BeginStartServer(object sender, EventArgs e) { int port; if (!int.TryParse(txtPort.Text, out port)) { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } // 서버에서 클라이언트의 연결 요청을 대기하기 위해 // 소켓을 열어둔다. IPEndPoint serverEP = new IPEndPoint(thisAddress, port); mainSock.Bind(serverEP); mainSock.Listen(10); // 비동기적으로 클라이언트의 연결 요청을 받는다. mainSock.BeginAccept(AcceptCallback, null); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; try { // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } Console.WriteLine(obj.Buffer); // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); Console.WriteLine("데이터 브로드 캐스트" + text); string[] arrayText; arrayText = text.ToString().Split('?'); DataForm data = new DataForm(); data = JsonConvert.DeserializeObject <DataForm>(arrayText[0]); if (data.req == null) { MsgBoxHelper.Error("null"); data.req = ""; } if (data.req.Equals("close")) { MsgBoxHelper.Error("close 들어옴"); Console.WriteLine("close 들어옴"); obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format("[받음]{0}: {1}", data.id, data.text)); // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다. for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { string request = JsonConvert.SerializeObject(data); AESEncrypt256(request, key); Encoding.UTF8.GetBytes(AESEncrypt256(request, key)); Console.WriteLine("이 암호화된 내용으로 브로드 캐스팅 : " + AESEncrypt256(request, key)); socket.Send(Encoding.UTF8.GetBytes(AESEncrypt256(request, key))); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } // connectedClients.RemoveAt(i); } } } // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } catch { } }