2013-01-12 179 views
0
fp = fopen("image.jpg","rb"); 
if (!fp) 
    exit(1); 
fseek(fp,0,SEEK_END); 
len = ftell(fp); 
fseek(fp,0,SEEK_SET); 
buf = (char *)malloc(len); 
fread(buf,len,1,fp); 
fclose(fp); 


if (WSAStartup(0x0202,&wsa) != 0) 
{ 
    printf("Error code : %d",WSAGetLastError()); 
    return 1; 
} 



if((s = socket(AF_INET , SOCK_STREAM , 0)) == INVALID_SOCKET) 
{ 
    printf("Error code : %d" , WSAGetLastError()); 
    WSACleanup(); 
    exit(1); 
} 


server.sin_family = AF_INET; 
server.sin_addr.s_addr = INADDR_ANY; 
server.sin_port = htons(8888); 


if(bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR) 
{ 
    printf("Error code : %d" , WSAGetLastError()); 
    closesocket(s); 
    WSACleanup(); 
    exit(EXIT_FAILURE); 
} 

sprintf(str,"%d",len); 
strcpy(message,"HTTP/1.1 200 OK\r\nContent-Length: "); 
sprintf(message,"%s %s",message,str); 
sprintf(message,"%s %s",message,"\r\nContent-Type: image/jpeg\r\n\r\n"); 
sprintf(message,"%s %s",message,buf); 
sprintf(message,"%s %s",message,"\r\n"); 

listen(s , 100); 

c = sizeof(struct sockaddr_in); 

while((new_socket = accept(s , (struct sockaddr *)&client, &c)) != INVALID_SOCKET) 
{ 
    memset(recvdata,'\0',sizeof(recvdata)); 
    recv(new_socket,recvdata,2000,0); 

    send(new_socket , message , strlen(message) , 0); 
} 

if (new_socket == INVALID_SOCKET) 
{ 
    printf("Error code : %d" , WSAGetLastError()); 
    closesocket(s); 
    WSACleanup(); 
    return 1; 
} 
closesocket(s); 
WSACleanup(); 
return 0; 

}套接字 - 發送圖像

我有發送圖像文件有問題。這是通信的服務器端,瀏覽器將是客戶端。當我嘗試連接到服務器時,服務器接受連接並且一切正常。然後我想發送圖像作爲響應,並且它應該在瀏覽器中顯示。任何人都可以告訴我這裏有什麼問題嗎?

+0

客戶端收到什麼數據? – peterph

+0

GET/HTTP/1.1 的User-Agent:歌劇/ 9.80(Windows NT的6.1; WOW64)的Presto/2.12.388版本/ 12.12 主持人:127.0.0.1:8888 接受:text/html的,應用/ XML ; q = 0.9,application/xhtml + xml,image/png,image/webp,image/jpeg,image/gif,image/x-xbitmap,*/*; q = 0.1 Accept-Language:en-US, en; q = 0.9 Accept-Encoding:gzip,deflate Connection:Keep-Alive 這是客戶端收到的。 – user1973035

回答

2

很多問題。剛開始:

  • 你是不是檢查系統調用(listen()recv()send()等)的返回值,所以你不知道的錯誤,有多少數據你發送或接收。
  • 在這裏用printf()這樣的圖像文件打印二進制數據是一個壞主意TM - 它會在第一個零字節處被截斷,或者它可能會因缺少這種情況而超出內存。
  • 您假定recv()消費來自客戶端的完整HTTP請求。它可能不會,所以你打破了HTTP協議。
  • 您在循環中沒有關閉連接的客戶端套接字。這是資源泄漏。
+0

但我只是想發送image.I不關心請求。我不檢查請求的客戶端。此代碼工作的文本。我只是改變字符串消息在請求答案,並把二進制數據我從圖像文件中讀取。 – user1973035

+0

將二進制數據直接發送到套接字,不要「打印」它。您的代碼意外地與文本文件「工作」。研究HTTP協議 - 這樣比較複雜。 –

+0

我想製作一個響應的字符串。所以我把內容類型和內容的長度作爲迴應。最後,我想把數據。但如何連接二進制數據和其餘的響應? – user1973035