2012-02-26 3 views
1

브라우저가 특정 사이트에 연결을 시도 할 때 블랙리스트를 확인하고 404를 되돌려 보낼 때 서버를 작성했습니다. 그러나 send()를 호출하면 오류는 발생하지 않지만 메시지는 않습니다. 연결을 끊지 않으면 웹 브라우저에 나타나지 않습니까?C 소켓 프로그래밍, 보내기

어떤 조언이 필요합니까?

while(1){ 
    connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen); 
    if (connfd == -1) { 
     perror ("unable to accept"); 
     return 1; 
    } 
    printf("%s:%d connected\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); 
    printf("%d",threadIndex); 
    pthread_create(&(thread[threadIndex++]), NULL, processRequests, (void *)connfd); 

    } 

요청을 처리 방법은 보내는 브라우저에서

수락 연결 니펫을 :

if(blacklisted ==1){ 
        printf("is blacklisted\n"); 
        char *response404 = "HTTP:/1.1 404 not avaliable\r\n\r\n"; 

        printf("%s\n",response404); 
        int len, bytes_sent; 
        len = strlen(response404); 
        bytes_sent = send(connfd, response404, len, 0); 
        if(len != bytes_sent){ 
         perror("message length doesn't match"); 

        } 
      } 
+2

'j'보다는'i'를 의미하는지 42 행에서 확인하십시오. –

+0

일부 코드를 추가했습니다. 죄송합니다. – drunkmonkey

+0

각 스레드가 자신의 복사본 인'connfd'를 가져 오지 않아야합니까? 코드에서 모두 같은 변수를 공유하는 것처럼 보입니다. –

답변

3

브라우저가 구문 분석하고 페이지를 표시하기 전에 닫아야 연결을 기다리고 있습니다.

주위가 없습니다.

(HTTP/0.9 및 1.0), 단일 요청/응답 쌍 후에 연결이 닫힙니다.

HTTP/1.1에서는 연결 요청이 두 개 이상의 요청에 대해 재사용 될 수있는 연결 유지 메커니즘이 도입되었습니다.

참고 : 특정 위치에 연결하는 모든 클라이언트에 대해 하나의 단일 페이지를 전송하기 때문에 킵 얼라이브 기술은 여기 아무 소용이 없습니다.

+0

이 작동하지 않는 것처럼 보이므로 모든 요청/응답 쌍에 대해 연결을 닫았다가 다시 열어야합니까? – drunkmonkey

+0

브라우저에 뭔가를 보낼 때마다 나중에 브라우저에서 모든 데이터가 브라우저에서 구문 분석되도록 서버 측에서 완료되었음을 알 수 있도록 연결을 닫아야합니다. 그래서 기본적으로 tcp 연결을 열고 닫는 것을 처리하는 루프를 생성해야합니다. – EskoBra

+0

고맙습니다, 저 :) 새로운 스레드를 만들려고 할 때 segfault를 얻었지만 스레드 생성 루프가 정확합니까? – drunkmonkey