-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;
}
buffer是被讀取然後解析以獲得要顯示的圖像的URL行。它如何包含圖像數據?也有人說我應該使用互斥體進行同步。 newsockfd?不應該每個線程都有自己的變量newsockfd嗎? – jhowe
另外你是什麼意思只是在套接字上調用recv不會讀取我從來沒有在我的代碼中使用recv? – jhowe