2010-02-14 8 views
4

나는 API를 제공해야하는 서버를 리눅스에 작성하고있다.멀티 스레드 서버 문제

처음에는 하나의 포트에서 다중 스레드를 만들고 싶었습니다. 즉 단일 포트에서 여러 요청을 처리 할 때 여러 스레드가 작동하도록하고 싶었습니다.

내 친구 중 한 명이 그것이 그것이 작동하도록되어있는 방식이 아니라고 말했습니다. 그는 요청이 수신되면 먼저 Handshake 절차를 따라야하며 요청에 전용 된 다른 포트를 수신하는 스레드를 만든 다음 요청 된 클라이언트를 새 포트로 리디렉션해야한다고 말했습니다.

이론적으로는 매우 재미 있지만 핸드 셰이크를 구현하고 리디렉션을 수행하는 방법에 대한 정보를 찾을 수 없습니다. 누군가 도울 수 있습니까? 내가 메인 스레드가 포트에 듣기, 요청을 처리하기 위해 새로운 스레드를 생성하여 다중 스레드 서버를 작성하면 나는 당신의 응답을 해석하는 잘못 아니에요 경우


, 나는 기본적으로 그것을 멀티 스레드 만들고 있어요 단일 포트?

매초 많은 요청을받는 시나리오를 생각해보십시오. 포트의 모든 요청이 "현재"요청이 완료 될 때까지 대기해야한다는 것은 사실이 아닙니까? 그렇지 않다면 어떻게 통신을 계속할 것인가? 브라우저가 요청을 보내면, 이것을 처리하는 쓰레드는 먼저 포트를 듣고, 블록하고, 처리하고, 응답 한 다음 블록을 해제해야한다.

"multithreads"가 있는데, 포트가 차단되어 있기 때문에 메인 스레드와 별도로 한 번에 하나의 스레드 만 사용하고 있습니다.

+0

동일한 로컬 포트에 동시에 두 개 이상의 연결을 활성화 할 수 있습니다 - 이것에 절대적으로 아무런 문제가 없으며 모든 것이 정상적으로 작동합니다. 하나의 연결은 다른 연결을 "차단"하지 않습니다. 일단 만들어지면 완전히 독립적입니다. – caf

+0

안녕하세요. 댓글 주셔서 감사합니다. 나는 당신이 만들고있는 요지를 완전히 얻었고, 실제로 혼란스러워하고 있습니다. 하나 이상의 포트를 사용하는 연결이 두 개 이상일 경우 두 개의 서로 다른 클라이언트가 같은 포트에 연결한다는 것을 의미하므로 읽기/쓰기가 올바르게 수행되고 정보가 올바른 클라이언트로 전송되는 방법은 무엇입니까? 소켓 및 서버 프로그래밍에 대한 책/기사를 읽으려고했지만 잘못된 장소에서 해결책을 찾고 있음을 깨달았습니다. 누구든지이 주제에 대해 깔끔하고 작은 안내서를 제안 할 수 있습니까? –

+1

응용 프로그램의 관점에서 두 연결은 서로 다른 소켓, 즉 다른 파일 설명자로 나타납니다. 전송 (TCP/IP) 관점에서, 두 개의 연결은 서로 다른 (원격 IP, 원격 포트, 로컬 IP, 로컬 포트) 튜플 (원격지 중 하나 또는 둘 모두)에 의해 식별됩니다. 주소는 다를 것입니다). – caf

답변

2

당신의 친구가 당신에게 말한 것은 수동 FTP와 비슷합니다. 클라이언트가 서버에 연결이 필요하다고 말하면 서버는 포트 번호를 다시 보내고 클라이언트는 해당 포트에 대한 데이터 연결을 만듭니다.

하지만 다하고 싶었던 것은 다중 스레드 서버입니다. 필요한 포트를 청취하고 연결하는 하나의 서버 소켓 만 있으면됩니다. 자동 TCP 핸드 셰이크가 끝나면 accept 함수에서 새 소켓을 가져옵니다. 소켓은 방금 연결 한 클라이언트와의 통신에 사용됩니다. 이제는 새 스레드를 만들어서 클라이언트 소켓을 스레드 함수에 전달하면됩니다. 서버 스레드에서 다른 연결을 받아들이려면 다시 accept을 호출합니다.

2

핸드 셰이크를 수행 할 이유가 없다면 TCP/IP가 핸드 셰이크를 수행합니다.

응용 프로그램 특정 핸드 셰이크의 예로 사용자 인증이 있습니다.


동료가 FTP의 작동 방식과 비슷하다고 생각하는 것. 이것은 좋은 일이 아닙니다. 오늘날 요즘 인터넷은 단일 포트를 사용하는 프로토콜에 많이 사용되며 명령 포트가 불량합니다. 이유 중 하나는 statefull 방화벽이 멀티 포트 응용 프로그램 용으로 설계되지 않았기 때문입니다. 이런 식으로 일을하는 각각의 개별 응용 프로그램을 위해 확장되어야합니다.

1

ASIO's tutorial on async TCP보세요. 한 부분은 TCP에서 연결을 허용하고 각각이 단일 클라이언트와 통신하는 핸들러를 생성합니다. 이것이 TCP 서버가 일반적으로 작동하는 방식입니다 (가장 일반적인 TCP 프로토콜 인 HTTP/web 포함).

연결 당 스레드를 생성 할 때 ASIO의 비동기 항목을 무시할 수 있습니다.귀하의 질문에는 적용되지 않습니다. (완전히 비동기이며 코어 당 하나의 작업자 스레드가 좋지만 나머지 환경과 잘 통합되지 않을 수 있습니다.)