2012-02-26 69 views
1

我寫過一個服務器,當瀏覽器試圖連接到某些站點時,它會檢查一個黑名單並返回一個404,但是當我調用send()時,沒有錯誤,除非關閉連接,否則不會出現在Web瀏覽器上?C socket編程,發送

有什麼建議嗎?從瀏覽器

接受連接

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

檢查第42行,你是指「我」而不是「j」。 – 2012-02-26 23:55:36

+0

我已經添加了一些代碼,對不起 – drunkmonkey 2012-02-27 00:01:51

+0

不應該每個線程都得到自己的'connfd'副本嗎?它看起來像你的代碼,他們都共享相同的變量。 – 2012-02-27 00:07:18

回答

3

瀏覽器正在等待的連接它分析和顯示頁面之前被關閉。

沒有辦法。

在HTTP/0.9和1.0中,連接在單個請求/響應對後關閉。

在HTTP/1.1中引入了一個保持活動機制,其中一個連接可以重複用於多個請求。

注:保持連接技術已經沒有用了,因爲在這裏你發送一個單頁爲每個客戶端連接到特定的位置。

+0

所以連接必須關閉,並重新打開每個請求/響應對? – drunkmonkey 2012-02-27 00:30:20

+0

每次向瀏覽器發送內容時,必須先關閉連接,以便瀏覽器知道服務器端何時完成發送所有要在瀏覽器中解析的數據。所以基本上你必須創建一個處理打開和關閉tcp連接的循環。 – EskoBra 2012-02-27 00:42:10

+0

謝謝,那工作:)雖然當我嘗試創建一個新的線程我得到一個段錯誤,是我的線程創建循環是否正確? – drunkmonkey 2012-02-27 01:24:04