我正在尝试加载用户指定的图像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;
}

最佳答案

首先,您在newsockfd上没有同步。您将newsockfd的地址传递给线程,但是主线程随后更改其值。您绝不允许在一个线程正在修改或可能正在修改另一个线程时访问该对象。您使用newsockfd违反了此规则。

第二:

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


%s格式说明符用于C样式的字符串。此时,buffer包含任意图像数据。

第三:您的代码从传入的TCP连接中读取一些字节,然后像读取消息一样工作。但是,您从未读过任何消息。您没有代码可阅读消息。如果您的应用程序要使用消息,则需要编写代码以接收消息。仅在套接字上调用recv不会读取消息,因为TCP协议不是消息协议。

您可能还有更多问题,但这些问题最严重。

同样,从性能的角度来看,将这么小的数据写入连接仍然很糟糕。取而代之的是,将较大的块组装在缓冲区中,并减少对write的调用。

关于c - 为什么我得到的图像由于代码错误而无法显示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43574453/

10-11 22:59
查看更多