当前位置: 技术问答>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,直到数据传输完成,你试试!!!
你是不是客户端一次发送了8M的图片数据?
你的服务器的接收端一次收了多少?
你的服务器接收端应该没有接受完?server的socket buffer没有8M那么大,我觉得你可以在客户端把图片分隔开
来传输,一次传输1K, 服务器一次也只接收1k,直到数据传输完成,你试试!!!
|
不能期望单次send()可以发送完成所有数据,也不能期望单次recv()可以接收完成所有数据
建议客户端循环发送,检查send()的返回值以得到实际发送的字节数目,直到所有的数据发送完毕
服务器循环接收,直到所有的数据接收完毕
建议客户端循环发送,检查send()的返回值以得到实际发送的字节数目,直到所有的数据发送完毕
服务器循环接收,直到所有的数据接收完毕
|
建议你了解一下TCP/IP协议栈的原理
就应该比较明白了
就应该比较明白了