2017-04-23 7 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は任意の画像データを含んでいます。

第3:あなたのコードは、着信TCP接続からいくつかのバイトを読み取り、メッセージを読み取ったかのように動作します。しかし、あなたは決してメッセージを読まない。あなたはメッセージを読むためのコードがありません。アプリケーションでメッセージを使用する場合は、メッセージを受け取るコードを記述する必要があります。ソケット上でrecvを呼び出すだけでは、TCPプロトコルがメッセージプロトコルではないため、メッセージは読み取られません。

おそらくもっと問題がありますが、それは最も深刻です。

また、パフォーマンスの観点から見ると、このような小さなビットのデータを接続に書き込むのはひどいことです。代わりに、大きなチャンクをバッファでアセンブルし、writeへの呼び出しを減らします。

+0

バッファは、読み取られた後に解析されて表示するイメージを取得するURL行です。どのように画像データが入っていますか?あなたの言っても、私はmutexを使って同期するべきです。 newsockfd?すべてのスレッドが独自の変数newsockfdを持つべきではありませんか? – jhowe

+0

また、ちょうど私のコードでrecvを使用することはありませんソケットでrecvを呼び出すことを意味しますか? – jhowe

関連する問題