2017-04-23 36 views
-1

我試圖加載用戶指定的圖像Koala.jpg(從瀏覽器),但是最終發生的是一個永無止境的加載屏幕,然後無法顯示圖像的錯誤。這是爲什麼?我爲什麼得到圖像無法顯示,因爲我的代碼有錯誤?

void *connectionThread(void *socket_desc){ 

    FILE* fd; 
    char buffer[256]; 
    int newsockfd = *(int*)socket_desc; 
    int n; 
    magic_t myt = magic_open(MAGIC_ERROR|MAGIC_MIME_TYPE); 
    magic_load(myt,NULL); 

    bzero(buffer,256); 

    while (1) 
    {memset(buffer, 0, 255);n = read(newsockfd,buffer,255); 
    if (n < 0) error("ERROR reading from socket");//error checking 

    printf("Here is the message: %s\n",buffer);  

    if((strncmp(buffer,"GET",3) == 0)){ //GET request 
     char *header = "HTTP/1.1 200 OK\r\nContent-Type: "; 

    //st_size filesize = stat(buffer, &st); 

     char *token = strtok(buffer," "); 
    if(token !=NULL) 
     token = strtok(NULL, " "); 
    token = strtok(token,"\n"); 
    token = strtok(token,"/"); 

    fd = fopen(token, "rb"); 

    send(newsockfd,header,strlen(header),0); 
    printf("token is: %s\n",token); 
    printf("magic output: '%s'\n",magic_file(myt,token)); 
    //write(newsockfd,"<",strlen("<")); 
    write(newsockfd,magic_file(myt,token),strlen(magic_file(myt,token))); //get Content-type 
    //write(newsockfd,">",strlen(">")); 
    write(newsockfd,"\r\n",strlen("\r\n")); 
    write(newsockfd,"Content-Length: ",strlen("Content-Length: ")); 
    write(newsockfd,"780831\r\n\r\n",strlen("780831\r\n\r\n")); 



    } 

    if ((strncmp(buffer,"quit",4) == 0)) //quit 
    break; 
    n = write(newsockfd,"I got your message\n May I have another\n",40); 
    if (n < 0) error("ERROR writing to socket"); 
    } 
    write(newsockfd,"Ok, I am quitting\n",18); 
    fclose(fd); 
    close(newsockfd); 
    magic_close(myt); 
    pthread_exit(NULL); 
    return 0; 
} 

下面是我如何製作套接字並將其綁定,以防萬一出現這種情況。

int main(int argc, char *argv[]) 
{ 
    int sockfd, newsockfd, portno,c; 
    struct sockaddr_in serv_addr, cli_addr; 
    if (argc < 2) { 
     fprintf(stderr,"ERROR, no port provided\n"); 
     exit(1); 
    } 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    puts("Created socket"); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(argv[1]); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 


    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
       error("ERROR on binding"); 


    listen(sockfd,5); 

    c = sizeof(struct sockaddr_in); 
    pthread_t thread_id; 

    while((newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t*)&c))){ 
     if (newsockfd < 0) 
       error("ERROR on accept"); 

     pthread_create(&thread_id, NULL, connectionThread, (void *)&newsockfd); 

    } 
    close(sockfd); 
    return 0; 
} 

回答

1

首先,您在newsockfd上沒有同步。您將newsockfd的地址傳遞給線程,但主線程更改其值。您絕不允許在一個線程中訪問對象,而另一個線程正在或可能正在修改它。你打破這個規則newsockfd

二:

printf("Here is the message: %s\n",buffer);  

%s格式說明是C風格的字符串。此時,buffer包含任意圖像數據。

第三:您的代碼從傳入的TCP連接中讀取一些字節,然後就好像它讀取了一條消息一樣。但是你從來沒有讀過一條消息。你沒有讀取消息的代碼。如果您的應用程序要使用消息,則需要編寫代碼來接收消息。只需在套接字上調用recv將不會讀取消息,因爲TCP協議不是消息協議。

你可能有更多的問題,但這些是最嚴重的。

另外,從性能的角度來看,繼續將這麼小的數據寫入連接是非常糟糕的。相反,在緩衝區中組裝較大的塊並使用較少的呼叫到write

+0

buffer是被讀取然後解析以獲得要顯示的圖像的URL行。它如何包含圖像數據?也有人說我應該使用互斥體進行同步。 newsockfd?不應該每個線程都有自己的變量newsockfd嗎? – jhowe

+0

另外你是什麼意思只是在套接字上調用recv不會讀取我從來沒有在我的代碼中使用recv? – jhowe

相關問題