2013-06-06 1 views
0

누군가 내 문제를 해결할 수 있기를 바랍니다.pthread 내에서 연결 허용

main() 
{ 
1)create socket 
2)bind on port 8888 
3)listen 
5) while(accept) 
    { 
    5) create pthread1 to handle the connection using function1 
    6)join the pthread1 
    } 
} 

function 1() 
{ 
1)take the file descriptor from the main 
2) discusses with client using the descriptor (send/recv) 
3) create pthread2 to handle data exchange 
4) join the pthread 2 
5)free the descriptor 
} 
function 2() 
{ 
1)create socket 
2)bind on port 8889 
3)listen 
4)accept 
} 

내 문제 : 나는 첫 번째 클라이언트를 시도 - 언제, 모든 것이 OK, 두 개의 연결 나는

내 프로그램의 구현이이처럼, C를 사용하여 클라이언트/서버 FTP 응용 프로그램을 만들려고 노력 잘 했어! - 두 번째 클라이언트를 시도하면 첫 번째 연결은 정상이지만 두 번째 연결은 BIND 오류가 발생합니다 !! - 문제의 원인을 알지 못합니다. - 도움을 주셔서 감사합니다.

답변

0

(1) 한 번에 하나의 클라이언트 스레드 (pthread1) 만 실행하려고합니다. main()에서 첫 번째 스레드가 완료 될 때까지 pthread_join을 차단하려고합니다. 따라서이 길을 계속 이어 나가면 분리 된 스레드를 생성하거나 thread1에 결합하는 다른 방법을 사용해야합니다. 또는 더 나은 방법은 스레드 풀을 사용하는 것입니다.

(2) 제 1 연결 후 이미 사용 중이므로 제 2의 bind이 실패하는 것 같습니다. 두 번째 연결이 설정되기 전에 첫 번째 연결이 닫히더라도 다시 사용할 수있게되기까지 시간이 걸립니다. 이 지연을 피할 수는 있지만이를 처리하는 방법은 아닙니다.

두 번째 bind 수신 포트를 직접 선택하십시오. 이렇게하려면 bind에 전달 된 주소 구조체에 포트 0을 지정하십시오. 시스템은 8889에서 실행되도록 하드 코딩 된 것이 아닌 청취 포트를 선택할 것입니다. 그러면 클라이언트에게 (pthread1에 설정된 제어 연결을 통해) "이봐,이 포트에 연결하여 데이터를 전송하십시오" 클라이언트는 연결을 설정해야합니다. 위의 개요에서이를 달성하기 위해 몇 가지 디자인을 변경해야합니다.

또 다른 방법은 하드 코딩 된 8889 수신 포트를 유지하는 것입니다. 단 한 번만 바인딩하면됩니다. 여기에는 몇 가지 문제가 있지만 이것은 단지 운동 일 뿐이라면 분명히 구현하기 쉽습니다.

경고 : FTP 서버에 대해 생각해 본지 오래되었지만 이것이 수동 모드의 기본 개요입니다.

+0

답장을 보내 주셔서 감사 드리며,이 문제를 해결하고 결과를 알려 드리겠습니다. –

+0

이제 코드 편집 : for 루프를 1025에서 40000으로 변경 한 다음 바인딩이 제대로 된 후 클라이언트에 포트 번호를 보내고 모든 클라이언트가 원하는대로 연결할 수 있습니다. 정말 고마워요. . –

+0

@badr assa - 추악한 측면에서 비효율적이지만'bind' 오류를 처리하고 이미 사용중인 포트를 건너 뛰면 작동 할 것입니다. 문제가 생기면 위에서 제안한 방법으로 전환 할 것을 제안하십시오. 'bind'에 0 포트를 건네주고'getsockname'으로 할당 한 포트를 검색하십시오. 깨끗해. 어쨌든 나는 네가가는 길에 기쁘다. 행복한 코딩. – Duck

0

thread-2가 사용하는 데이터 교환 포트는 스레드 -1에 의해 클라이언트와 함께 수행 된 세션 승인 중에 미리 선택된 임의의 포트 여야합니다.


은 또한 당신은 분리 된 스레드를 실행 나을 수 있습니다, 그래서 그들과 합류 할 필요는 적어도 블록 메인 서버를 연결하는 현재의 디자인으로,이 없다.