QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1702|回复: 9

请教socket传输图片问题

[复制链接]
发表于 2005-5-23 15:22:07 | 显示全部楼层 |阅读模式
我在自己的机子上传图片没有问题,可我向我的一块试验板传图片的时候,就出问题了,显示是已经传完,也看到了.jpg格式的文件了,但是打不开?
请教各位牛人帮忙解答!
发表于 2005-5-23 16:14:10 | 显示全部楼层
你的意思是在板子上打开和显示这个文件?
那应该分开两步 传输 然后和你用别的方法 比方说下载线预先写入的同一个文件对比 是不是传输问题
然后看是不是打开解码的问题
回复

使用道具 举报

 楼主| 发表于 2005-5-23 20:26:27 | 显示全部楼层
谢谢你啊,可不好意思啊你说的我还是不很明白,能再明白些不?
我确定的是我别的图片可以显示,就是拷过去的,但是传过去的不可以
感觉是传输问题
但是为何机子上的就好着呢
回复

使用道具 举报

发表于 2005-5-24 08:54:46 | 显示全部楼层
你在板子上写一个简单的文件比较程序 预先用任何你确认可靠的办法上传一个文件 然后用网络再上传一个 然后对比两个文件是不是有区别
回复

使用道具 举报

 楼主| 发表于 2005-5-24 15:21:18 | 显示全部楼层
我看我那两个文件就大小有区别,我看不出有其他的区别
就是我是将整个图片一起传的,所以,穿过个去的图片是缓冲区的大小
回复

使用道具 举报

 楼主| 发表于 2005-5-24 15:26:30 | 显示全部楼层
想请问楼上那位朋友的QQ号,不知道可以不,我的是121853049,
回复

使用道具 举报

发表于 2005-5-24 15:40:27 | 显示全部楼层
我看我那两个文件就大小有区别,我看不出有其他的区别

晕啊 大小有区别不就是说没传完么!
以防我误解了:
1。你怎么确定你的解码显示没问题的?需要板子上至少有一个图片文件A.jpg对吧?不管你是怎么搞上去的,反正你已经有一个pc到开发板的可靠传输途径,对吧?所以你也能搞上去b.jpg,c.jpg......对吧?
2。测试通过网络传送A.jpg,对比板子上的A.jpg有什么问题,大小,内容.....
3。多次测试就知道问题是不是传输这里了? 如果图片文件都一样,那就不关传输部分的事情了。
回复

使用道具 举报

 楼主| 发表于 2005-5-24 16:27:10 | 显示全部楼层
就像你说的,板子上已经有那个图片文件了,就是你说的A.JPG
我是个新手,我不知道如何看图片的内容,我只看到我传过去的图片的大小是我定的缓冲区的大小,但是我给主机传的时候,传的也是缓冲区的大小。
回复

使用道具 举报

 楼主| 发表于 2005-5-24 16:27:41 | 显示全部楼层
就像你说的,板子上已经有那个图片文件了,就是你说的A.JPG
我是个新手,我不知道如何看图片的内容,我只看到我传过去的图片的大小是我定的缓冲区的大小,但是我给主机传的时候,传的也是缓冲区的大小。
回复

使用道具 举报

 楼主| 发表于 2005-5-24 16:31:38 | 显示全部楼层
我的代码如下,望赐教!
/*fwq.c
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>

int port=8000;
int main(int argc,char *argv[])
{
char c,buf[20480];
char filename[30];
int fromlen,source;
int n=0;
FILE  *target;
char *strs="\n receiving file";
register int s,ns,k;
struct sockaddr_in sin;

s=socket(AF_INET,SOCK_STREAM,0);
if(s<0){
perror("get socket no!!!");
exit(3);
}

bzero(&sin,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.s_addr=INADDR_ANY;
if(bind(s,(struct sockaddr *)&sin,sizeof(sin))<0){
perror("bind socket no!!!");
close(s);
exit(4);
}
if(listen(s,5)<0){
perror("server:listen");
exit(5);
}
printf("%s",strs);
while(1){
if((ns=accept(s,(struct sockaddr *)&sin,&fromlen))<0){
perror("server:accept");
exit(6);
}
/*while((k=read(ns,file,sizeof(file)))>0){
write(1,"filename:",9);
printf("%s",file);
}*/
sprintf(filename,"pic%d.jpg",n++);
while(k=read(ns,buf,sizeof(buf))>0)
if((target=fopen(filename,"wb"))!=NULL){
fwrite(buf,1,sizeof(buf),target);
printf("\n received succeeded");
}
close(ns);
fclose(target);
}
}

/*
khj
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <sys/io.h>
#include <string.h>

//char *host_name="127.0.0.1";
int port=8000;
int main(int argc,char *argv[])
{
char buf[20480],*file;
char *host_name;
host_name=argv[1];
file=argv[2];
FILE *source;
register int s;
size_t k;
struct sockaddr_in sin;
struct hostent *hp;
printf("\n");

if((source=fopen(file,"rb"))<0){
perror("file open");
exit(1);
}
printf("\n sending,wait!");

hp=gethostbyname(host_name);
if(hp==NULL){
perror("get address failure!");
exit(1);
}
s=socket(AF_INET,SOCK_STREAM,0);
if(s<0){
perror("get socket no!!!");
exit(2);
}
sin.sin_family=AF_INET;
sin.sin_port=htons(port);
sin.sin_addr.s_addr=htonl(INADDR_ANY);
sin.sin_addr.s_addr=((struct in_addr *)(hp->h_addr))->s_addr;
//bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
printf("\n connecting with server!");
if(connect(s,(void *)&sin,sizeof(sin))<0){
perror("connect!!");
exit(3);
}
lseek(source,0L,0);
//write(s,file,strlen(file));
while((k=fread(buf,1,sizeof(buf),source))>0){
write(s,buf,k);
printf("\n send success!\n");
}
printf("\n send %d\n",strlen(buf));
close(s);
close(source);
return 0;
}
真的很感谢楼上的这位朋友,希望你能不厌其烦,给我指点!
再次谢谢啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-6 00:42 , Processed in 0.048131 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表