Microsoft MVP성태의 닷넷 이야기
c# Socket Server에 접근할 수 있는 client 개수 제한 [링크 복사], [링크+제목 복사]
조회: 2387
글쓴 사람
황윤하
홈페이지
첨부 파일
 
안녕하세요 현재 socket 통신 관련 개발을 하고 있습니다.
server에 접근할 수 있는 client수를 5개로 제한 하고 싶은데 아무리 찾아도 모르겠고, 이해가 되지 않아 글을 남깁니다.

//Server Open
                    ServerSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    ServerSoc.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    IPAddress ServerIP = IPAddress.Parse(strIP);
                    IPEndPoint IPEP = new IPEndPoint(ServerIP, iPort);

                    ServerSoc.Bind(IPEP);
                    ServerSoc.Listen(20);
                    //ServerSoc.Blocking = true;

                    SocketAsyncEventArgs Args = new SocketAsyncEventArgs();
                    Args.Completed += new EventHandler<SocketAsyncEventArgs>(ServerAccept);
                    ServerSoc.AcceptAsync(Args);

                    bConntReq = true; //오픈 성공
                    bConnectOK = false;

//Client Accept
                    if (SocList.Count < 5)
                    {
                        SocList.Add(e.AcceptSocket);string strAddr = SocList[SocList.Count - 1].RemoteEndPoint.ToString();
                        string[] strArr = strAddr.Split(new char[] { ':' });
                        bConnectOK = true;
                        Log.LogStr(false, DataContainers.SYS, "ClientCount: " + (SocList.Count).ToString() + ", Client IP: " + strArr[0] + " Port: " + strArr[1] + ", Connect Success");

                        if (TCPIPThread == null)
                        {
                            TCPIPThread = new Thread(SendData);
                            bTCPIPThreadChk = true;
                            TCPIPThread.Start();
                            Log.LogStr(false, DataContainers.SYS, "TCPIPThread Start");
                        }
                    }
                    else
                        Log.LogStr(false, DataContainers.SYS, "ServerAccept, 연결 가능 Client 개수 초과, Client Count: " + SocList.Count.ToString());
                 
                    e.AcceptSocket = null;
                    ServerSoc.AcceptAsync(e); //새로운 Client 대기


위와 같이 소스를 구현해뒀습니다.
6번째 클라이언트가 접속 시 오픈되어있는 서버로 접속은 가능하지만, 데이터는 안들어 오도록 되어있습니다.
제가 하고 싶은건 아예 오픈되어있는 서버로 접속도 못하게끔 막는 것 입니다.
1. 5번째 클라이언트가 들어왔을 때 서버를 close하는 방법 밖에는 없는 것인가요?
100ms마다 계속해서 데이터를 전송해야 하는데 close를 시켜도 상관이 없을까요...?
                        if (SocList.Count == 1)
                        {
                            ServerSoc.Close();
                            bConntReq = false;
                        }
2. server socket을 닫는 방법 말고 막는 방법이 있다면 알려주세요..

답변 달아주시면 감사하겠습니다...!!







[최초 등록일: ]
[최종 수정일: 11/15/2018 ]


비밀번호

댓글 쓴 사람
 



2018-11-15 12시32분
그럼 Accept를 하지 않으면 됩니다. 이렇게 하려면 현재 소켓 수를 파악하고 있다가 5개가 되면 더 이상 Accept를 호출하지 않는 상태를 유지합니다. 그러다 기존 소켓을 Close하는 상황이 오면 그 순간에 새롭게 Accept를 하면 됩니다.

참고로, Accept하지 않으면 Listen에 지정한 수만큼 큐에 쌓이게 되고 그 큐를 넘어서면 연결 시도 순간부터 거절당합니다. 관련해서는 다음의 글을 참고하세요.
 
Socket.Listen에 전달된 backlog 인자의 의미
; http://www.sysnet.pe.kr/2/0/1826
정성태
2018-11-15 01시12분
[황윤하] 음.. 정확히 이해를 못하겠습니다.
연결된 소켓의 수는 알 수 있으나, Close 대신 Accept를 다시 하는 것이.. 어떻게 해야 될지 모르겠습니다..
현재 소스상 EventHandler를 이용하여 클라이언트가 붙기만 하면 ServerAccept 로직으로 들어오게 되어있는데.. 새로운 이벤트 핸들러를 써서 다시 Accept을 불러오라는 말씀이신지요?...
[손님]
2018-11-15 01시22분
[황윤하] 음.. 새로운 클라이언트를 대기 하기 위하여 ServerSoc(오픈용 서버)을 null로 만드는데, 소켓 수가 5개가 되면 null로 만들지 않고 Listen를 1로 지정해서 Accept를 거절하라는 말씀이신지요?
[손님]
2018-11-15 01시39분
[황윤하] 아... 무슨 말인지 이해했습니다....... 감사합니다.....
[손님]
2018-11-15 02시51분
^^b
정성태

1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...
NoWriterDateCnt.TitleFile(s)
490510/25/20172555watermark 관련문의 [1]
4903Ho10/25/20172508간단한 서버를 구현해 보고 싶습니다. [2]
4902황재승10/22/20173153C# 7.1 프로그래밍 왕초보자도 이해할 수 있는 수준인가요? [1]
4901김레오10/17/20175739c# 프로그램 난독화 도구인 confuserex라는 도구를 사용하다 여쭙습니다. [2]
4900황준범10/12/20172733ClickOnce 배포관련 질문드립니다. [1]
4899Question9/28/20174376C# 프로그램이 "응답 없음" 시에도 계속 독립적으로 돌아가는 타이머 생성법 [3]
4898ssdrm9/27/20173034Clickonce 실행시 보안에 막힙니다 ㅠ [1]
4897김태진9/23/20172979윈도우7 작업관리자의 상세(details)탭 생성에 대해 여쭙습니다. [1]
4896장진국9/19/20173251안녕하세요 WPF 에서 Window객체가 가비지 콜렉션에 의해 수집되지 않는거 같아서 문의드립니다. [1]
4895Question9/18/20173114Generic 에 관하여 질문드립니다. [5]
4894얼마전6.0구매자9/14/20173258C# 7.1에서 보강된 부분만 PDF로 제공하는 건 아니되나요? [2]
4893BigII9/14/20172995타 언어(JAVA, PHP 등)에서 받은 RSA 개인키 문자열을 이용하여 내용 복호화 가능 여부 [4]
4892Question9/13/20173114서브 폼에서는 무거운 작업을해도 속도가 빠를까요 ?? [1]
4891윤현수9/11/20173109Taskbar에 관한 질문입니다. [5]
4890제발9/11/20172972 시작하세요! C# 6.0 프로그래밍 책이 절판됐나요? [5]파일 다운로드1
4889낙낙이9/7/20172637안녕하세요! xsl관련 이야기입니다. [1]
4888heyhey9/6/20172638클릭원스를 수동으로 배포 시 업데이트 할 때 [1]
4887이경현9/4/20173071Windows server 2012 파일 없어짐 현상... [1]
4886질문자9/1/20174877disconnecteditem에 대하여 아시나요? [4]파일 다운로드1
4883솔솔8/30/20172741dataview에서 select한 index 가져오기 [1]
4882user8/30/20173776UI 변경 작업 여러개를 동시에 사용하려면 어떻게 해야되나요 ?? [7]
4884user8/31/20172511    답변글 [답변]: UI 변경 작업 여러개를 동시에 사용하려면 어떻게 해야되나요 ??파일 다운로드1
4881kmi8/30/20172832진행속도가 중간에 더뎌지는 문제가 있는데 해결할 수 있는 방법이 있나 궁금합니다. [3]
4880김호종8/29/20173046HTTP JSON POST 관련 질문 드립니다. [1]
4879aos8/27/20172816DateTime 표시할 때 포맷 설정시 밀리초까지 포함하는 법이 궁금합니다 [1]
4878heyhey8/25/20173194프로세스의 프로세스 찾기(?) [2]
1  2  3  4  5  6  7  8  9  10  11  12  13  [14]  15  ...