当前位置:  技术问答>linux和unix

小弟Linux下socket编程传输图片,总是会丢失一部分数据,大侠来看看,有图有真相

    来源: 互联网  发布时间:2016-11-05

    本文导语:  /*socket_client.c,运行在arm9 Linux开发板中*/ #include  #include  #include  #include  #include  #include  #include  #include  #define PORT  4321 #define BUFFER_SIZE  8*1024 int main(int argc, char *argv[]) { int sock_fd,sendbytes; FILE *file_fd; int buf[BUFFER_SI...


/*socket_client.c,运行在arm9 Linux开发板中*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT  4321
#define BUFFER_SIZE  8*1024

int main(int argc, char *argv[])
{
int sock_fd,sendbytes;
FILE *file_fd;
int buf[BUFFER_SIZE];   // It is the integer 
struct hostent *host;
struct sockaddr_in serv_addr;

 long int num;
memset(buf,0,sizeof(buf));
file_fd = fopen("test-mmap.jpg","rb");
/* if(-1 == (num = fread(buf,1,sizeof(buf),file_fd)))
{
perror("fopen");
exit(1);
}
printf("file words num is : %dnn",num);
*/

if(argc h_addr);
bzero(&(serv_addr.sin_zero),8);

if(-1 == connect(sock_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)))
{
perror("connect");
exit(1);
}


if(-1 == (num = fread(buf,1,sizeof(buf),file_fd)))
{
perror("fopen");
exit(1);
}
if(-1 == (sendbytes = send(sock_fd,buf,num,0)))   //send()
{
perror("send");
exit(1);
}
if(num != sendbytes)
{
printf("num != sendbytesn");
//break;
}
printf("file words num is :%dn",num);
printf("-----sendbytes is :%dnn",sendbytes);


close(sock_fd);
close(file_fd);
exit(0);
}

-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------

/*socket_server.c,运行在虚拟机Linux中*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT  4321      //PORT number must be the same with client
#define BUFFER_SIZE  8*1024      // 1024 * 1024  = 1048576
#define MAX_QUE_CONN_NM 10

int main()
{
struct sockaddr_in server_sockaddr,client_sockaddr;
int sin_size,recvbytes;
int sock_fd,client_fd;
FILE *file_fd;
char buf[BUFFER_SIZE];
long int num;
int ii;

if(-1 == (sock_fd = socket(AF_INET,SOCK_STREAM,0)))   //SOCK_STREAM
{
perror("socket");
exit(1);
}
printf("Socket id = %d(sock_fd)n",sock_fd);

server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero),8);

int i = 1;
setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
if(-1 == bind(sock_fd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)))
{
perror("bind");
exit(1);
}
printf("Bind success!n");

if(-1 == listen(sock_fd,MAX_QUE_CONN_NM))
{
perror("listen");
exit(1);
}
printf("Listening....n");

if(-1 == (client_fd = accept(sock_fd,(struct sockaddr *)&client_sockaddr,&sin_size)))
{
perror("accept");
exit(1);
}

memset(buf,0,sizeof(buf));
if(-1 == (recvbytes = recv(client_fd,buf,sizeof(buf),0)))
{
perror("recv");
exit(1);
}
printf("sizeof(buf)= %dn",sizeof(buf));
printf("receive bytes num is :%dnn",recvbytes);
//FILE * abc_fd;

file_fd = fopen("./test-mmap.jpg","wb");
if(-1 == (num = fwrite(buf,sizeof(buf),1,file_fd)))
{
perror("fwrite date ");
exit(1);
}
// printf("Received a message: %sn",buf);
close(sock_fd);
fclose(file_fd);
exit(0);

}






知道看别人的代码是件挺痛苦的事情,尤其是我这样的没有注释的代码(因为是在Linux下编程,没有安装中文输入法,英文太麻烦,反正是改的例子,所以就没写了)还好代码不是很长,还是很希望能有高人帮我看看,传输到虚拟机中图片总是显示不全,不知道问题出在哪里,在这里先谢谢了。    
自学嵌入式真不是一件容易的事情。。。
[img=http://hi.csdn.net/space-7261272-do-album-picid-730787.html][/img]这里是完整图片的样子

[img=http://hi.csdn.net/space-7261272-do-album-picid-730789-goto-down.html][/img]这是传输不完整的图片

总是丢失数据,小弟刚学socket编程,不知道哪里有什么问题需要注意,还请大虾们指点一下,感激不尽。。。

|
哎,你这样是不行的!

你是不是客户端一次发送了8M的图片数据?

你的服务器的接收端一次收了多少?

你的服务器接收端应该没有接受完?server的socket buffer没有8M那么大,我觉得你可以在客户端把图片分隔开

来传输,一次传输1K, 服务器一次也只接收1k,直到数据传输完成,你试试!!!


|
不能期望单次send()可以发送完成所有数据,也不能期望单次recv()可以接收完成所有数据

建议客户端循环发送,检查send()的返回值以得到实际发送的字节数目,直到所有的数据发送完毕
服务器循环接收,直到所有的数据接收完毕

|
建议你了解一下TCP/IP协议栈的原理

就应该比较明白了

    
 
 

您可能感兴趣的文章:

  • 怎么用javamail发送附件,小弟刚接触,请各位大侠指教,谢谢!!!
  • 各位网络编程的大侠,帮帮小弟
  • 各位大侠,小弟有问题,请赐教!
  • 请各位大侠告知小弟可不可以?
  • 各位大侠小弟有个关于Linux上sendmail的设置问题。急!
  • 各位大侠,帮帮小弟!
  • 各位大侠,小弟请教个问题:SAMBA中如何设置ROOT作客户端用户名登陆?
  • 哪位大侠有JNDI的教程,分小弟一份吧,另问,我的可用分怎么不涨了,不是每天加10吗?
  • 哪位大侠给小弟发分RationalRoseProfessionalJEdition2002的license文件200份相送,不够再加
  • 夜深了,发情的母猫叫春了,小弟在此问各位深夜备战的大侠们两个问题?先谢了......
  • Libnids捕获FTP文件问题??跪求大侠们帮帮小弟!
  • 学习LINUX需要什么配置的机器,小弟正准备向LINUX进军,还请各位大侠指点一二!
  • 小弟做了Java大半年了,竟然不知道OA是什么。哪位大侠能够给我一个全称或者概念就行了!分数太多了,一定给分。
  • 各位大侠快帮助小弟一下吧!
  • 哪位大侠知道在哪可以下到unix/linux中一些命令,如ls,cat等的源码!小弟不甚感激.
  • petstore这个例子怎么看呀,感觉没有头绪,好象bea公司打包打的不对呀,都有重复的,请分析过petstore的大侠指点小弟一下。
  • 各位大侠,小弟想用JBuilder编程,推荐几本好书吧!
  • 请各位大侠告知小弟如何在servlet中可不可以通过ole来打开word?
  • 各位大侠好,小弟请教了!
  • 各位大侠,救救小弟!(高分想赠)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 大哥们,小弟我准备学JAVA了给推荐几本好书吧!小弟不胜感激啊!
  • 小弟问个问题,JDK哪有下载啊!小弟不胜感激啊!
  • linux高人!!!帮帮小弟啊,小弟是菜鸟
  • 哥们,谁有Jbuilder 4的注册码,给小弟解围,小弟谢先!!!
  • petstore这个例子怎么看呀,感觉没有头绪,好象bea公司打包打的不对呀,都有重复的,请分析过petstore的大侠指点小弟一下。 iis7站长之家
  • 哪位大哥给小弟一个squirrelmail的安装教程
  • OpenSSL安装过程中遇到的问题,希望大哥们帮帮小弟
  • 请各位大虾给小弟推荐几本好书
  • 小弟想在linux下访问windows 和usb的文件系统
  • 请问JBulider 4的序列号谁知到?能否提供给小弟?谢谢
  • 各位兄弟 谁有 powerZip 5.21 的注册码,小弟不胜感激!!
  • 小弟想用java做个sygate
  • 求教:文件打包移植错误发生排序错误,小弟努力送分送分啦!59~~~
  • 小弟急需要知道程序员查分网站。多谢!!!
  • 小弟签约银行,想装个unix先熟悉一下!
  • 小弟高分求“Linux 0.02版”的源代码!
  • 小弟是初学者,请推荐几本不错的unix书籍。
  • 小弟想学linux,推荐几本好书,有电子版下载的最好.
  • ★★★那位仁兄有Apache的源代码?小弟急用!多谢!!
  • 小弟初学JAVA,大家给点建议吧


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3