套接字 - 发送图像

时间:2013-01-12 20:29:19

标签: image sockets

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;

}

发送图片文件时遇到问题。这是通信的服务器端,浏览器将是客户端。当我尝试连接到服务器时,服务器接受连接,一切正常。然后我想发送图像作为响应,它应该在浏览器中显示。谁能告诉我这里有什么问题?

1 个答案:

答案 0 :(得分:2)

很多问题。刚开始:

  • 您没有检查系统调用的返回值(listen()recv()send()等),因此您不知道错误以及您发送了多少数据或收到。
  • 使用printf()从图像文件打印二进制数据是一个坏主意 TM - 它将在第一个零字节被截断,或者它可能因缺少这样。
  • 您假设recv()使用来自客户端的完整HTTP请求。它可能没有,所以你破坏了HTTP协议。
  • 您没有在循环中关闭连接的客户端套接字。这是资源泄漏。