私は、ユーザーが指定した(ブラウザからの)画像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;
}
バッファは、読み取られた後に解析されて表示するイメージを取得するURL行です。どのように画像データが入っていますか?あなたの言っても、私はmutexを使って同期するべきです。 newsockfd?すべてのスレッドが独自の変数newsockfdを持つべきではありませんか? – jhowe
また、ちょうど私のコードでrecvを使用することはありませんソケットでrecvを呼び出すことを意味しますか? – jhowe