2016-08-14 3 views
0

소켓에 연결을 수신하고 사용자를 인증 한 다음 인증에 제공된 정보와 일치하는 사용자 클래스에 소켓을 "보냅니다"이 서버를 추가하려고하는데이 서버를 빌드하려고합니다. 처리 (정보 교환, 다른 곳에서의 업데이트 등) 할 스레드 풀 (해당 클라이언트의 여러 장치 중).스레드 간 소켓 전송.?

서버에 24/7 요청을 보내지 않고 각 장치에 대해 가벼운 스레드를 열어두고 실시간으로 통신하기를 원하기 때문에이 방법을 선택했습니다.

이제까지 보았 듯이 Socket.DuplicateAndClose와 같은 일을 할 수 있지만 스레드가 아닌 프로세스에서 작동합니다.

누구든지이 작업을 수행 할 수있는 방법을 알고 있습니까? 그렇지 않으면 다른 방법을 사용해야합니까? 감사합니다.

EDIT : 혼란이 있었고, 다른 클래스의 다른 소켓으로 옮기고, 그 클래스에서 열린 스레드가 처리 할 것이라고 생각했습니다. 인증을 위해 연결을 수락하면 그 소켓은 그 연결을 가지고 있습니다. 그 소켓이 어디서 왔는지 알지 못했기 때문에 특정 클래스의 특정 소켓으로이를 수락 할 수 없었습니다. 내가 그 클래스의 쓰레드에서 그것을 사용한다면, 연결을 받아들이 기 위해 사용하는 다음 소켓이 하나가 될 것이기 때문에이 클래스를이 클래스를 사용하도록 말할 수 없기 때문에 나는 아무것도 할 수 없다. 그것은 같은 수업에 의해 점령되었습니다. 나는 수용된 소켓을 저장하기 위해 거대한 배열을 사용할 수 있었고, 그 소켓 번호가 그들의 소켓 번호라는 것을 클래스에 알릴 수 있었다. 그러나 그것은 제한되지 않았을 것이지만 느슨한 소켓의 묶음뿐만 아니라 작동 할 것이지만 최적화되거나 구성되지는 않을 것이다.

답변

1

주어진 소켓에 액세스하는 스레드에 대한 제한은 없습니다.

모든 스레드는 모든 스레드에서 작업을 수행 할 수 있습니다 (스레드의 프로세스에 해당 스레드에 대한 열린 핸들이있는 경우).

하나의 소켓에서 동일한 유형 (예 : 2 개의 읽기)을 동시에 여러 번 수행하면 혼란이 생길 ​​수 있습니다. 다음 데이터를 얻을 데이터를 제어 할 수없고 두 번째 데이터를 완료 할 수 없습니다. 그러나 명시 적 또는 암시 적 동시 제어의 모든 형식을 사용하여이를 피할 수 있습니다.

는 (.... 제한되어있는 유일한 방법은 뮤텍스하거나 해제 할 수 있습니다 중요한 부분을 잡고에만 스레드 같은 파일, 명명 된 파이프, 공유 메모리 섹션, 세마포어와 같은 다른 커널 개체에 적용됩니다.)

+0

네, 그 말이 이치에 맞고, 제 질문을 올바르게 물어 보지 않으면 너무 유감입니다. 나는 편집 할 것입니다. – TrisT

+0

사실 당신은 질문에 답했고 다른 것에 관해 이야기 할 때 요점을 보지 못했습니다. 나는 그것을 해결 된 것으로 표시하고 올바른 질문으로 하나를 여는 것입니다. – TrisT

+0

@TrisT 타입의'Socket' 필드는 객체에 대한 참조 일뿐입니다. 재 할당 할 수 있으며 동일한 객체에 대한 여러 참조도 좋습니다. (주의 : 필드가'readonly '이 아니라면 타입 정의 문제이고, 참조 대상과는 아무런 관련이 없다.) – Richard