목록SOCKET (4)
Coding Memo
Summary 1. 소켓이 listening 상태에서 Accept를 하지 않고 backlog도 여유가 있을 경우에 클라이언트에서 이 소켓에 Connect를 하게 된다면 실제로 연결이 되지 않았지만(Accept 되지 않았지만) 클라이언트에서는 Connect에 성공한 것으로 간주될 수 있다. 따라서 이 때, connect에 관련한 IO callback이 호출될 수 있고, SocketError 값 또한, Success로 받아들인다. 위 상황에서 서버는 실제로 Accept를 한 상태가 아니기 때문에 서버에서는 Connected로 간주되지 않는다. (다시 말하자면, accept를 하지 않고 있기 때문에 backlog(대기열)에만 연결 시도한 소켓이 추가되었을뿐 서버는 이 상태를 연결상태로 받아들이질 않는다.) 2..
흐름 제어란? 발신자가 수신자가 처리할 수 있는 것보다 더 빨리, 많이 데이터를 보낼 경우에 수신자는 일부 데이터(패킷)에 대해 삭제가 되거나 손실이 발생 할 수 있다. 이 문제를 방지하기 위해 TCP 연결에서는 흐름제어를 사용한다. 흐름제어(flow-control)는 수신자의 상태를 보고 전송을 제어하여 데이터의 손실이나 정체 없이 효율적이고 안정적으로 통신을 가능하게 한다. 예를 들어, 수신자가 100바이트의 버퍼를 가지고 있는데, 발신자가 150바이트의 데이터를 보냈다고 가정하자. TCP 연결에서 발신자는 수신자가 처리 할 수 있는 데이터의 양 (Sliding Window)을 미리 정한다. 따라서 발신자는 먼저 100바이트를 송신하고, 수신자가 먼저 100바이트를 받고 처리 후, 발신자에게 추가 데..
[요약] SocketAsyncEventArgs.BufferList을 통해 데이터를 전송 할 때, 반드시 새로운 리스트를 만들고 바이트 데이터를 그 리스트에 추가(Add)를 한 후에 그 리스트를 SocketAsyncEventArgs.BufferList에 직접 할당해야만 한다!! (이 관련 내용은 공식적으로 문서화 되어있지 않다고 한다.) 1. 리스트 생성 (IList) 2. 1에서 생성한 리스트에 아이템 추가(Add) 3. SocketAsyncEventArgs.BufferList에 1에서 생성한 리스트 직접 할당 ***SocketAsyncEventArgs.BufferList에 직접 아이템 Add 하지 말자.*** Why? BufferList의 Setter 호출 시, 기존 리스트에 있는 버퍼만 사용하기 때문..
에코 서버? 클라이언트로 부터 들어온 데이터(메세지)를 서버에서 그대로 다시 클라이언트로 전송하는 서버를 말한다. 서버와 클라이언트 설계 TCP 소켓을 이용해 서버와 클라이언트를 먼저 연결한 후에 메시지를 보낸다. 기억해야할 점은 데이터는 byte[] 타입으로 주고받는다는 것이다. 이를 잘 처리해야한다. 공통 1. TCP 소켓을 이용해 데이터를 송수신 2. 메시지 타입은 string, 인코딩 형식은 UTF-8로 통일 3. localhost를 이용하되, 코드를 통해 컴퓨터의 주소를 가져오고 그 첫 번째 주소를 엔드포인트로 사용 (port: 8888) 4. 간단하게 작성하고 테스트하기 위해 blocking 함수로 소켓 프로그래밍 5. 소켓에 대한 에러 확인 및 예외 처리는 생략 서버에서 이뤄져야 할 것들 1..