网络图片传输
2012-04-26 22:01
155 查看
/*socket_client.c,运行在arm9 Linux开发板中*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#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 : %d\n\n",num);
*/
if(argc < 2) //It was 3 first time.
{
fprintf(stderr,"USAGE:./client Hostname(or ip address)Text\n");
exit(1);
}
if(NULL == (host = gethostbyname(argv[1])))
{
perror("gethostbyname");
exit(1);
}
//memset(buf,0,sizeof(buf));
//scanf("%s",buf);
//sprintf(buf,"%s",argv[2]);
if(-1 == (sock_fd = socket(AF_INET,SOCK_STREAM,0)))
{
perror("socket");
exit(1);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr*)host->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 != sendbytes\n");
//break;
}
printf("file words num is :%d\n",num);
printf("-----sendbytes is :%d\n\n",sendbytes);
close(sock_fd);
close(file_fd);
exit(0);
}
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
/*socket_server.c,运行在虚拟机Linux中*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#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)= %d\n",sizeof(buf));
printf("receive bytes num is :%d\n\n",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: %s\n",buf);
close(sock_fd);
fclose(file_fd);
exit(0);
}
知道看别人的代码是件挺痛苦的事情,尤其是我这样的没有注释的代码(因为是在Linux下编程,没有安装中文输入法,英文太麻烦,反正是改的例子,所以就没写了)还好代码不是很长,还是很希望能有高人帮我看看,传输到虚拟机中图片总是显示不全,不知道问题出在哪里,在这里先谢谢了。
自学嵌入式真不是一件容易的事情。。。
这里是完整图片的样子
这是传输不完整的图片
总是丢失数据,小弟刚学socket编程,不知道哪里有什么问题需要注意,还请大虾们指点一下,感激不尽。。。
相关文章推荐
- [OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片
- 在BaseAdapter中 list优化 + 网络 获取图片利用线程传输
- 在网络传输中图片质量的控制
- .NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
- android 学习随笔七(网络:图片及文本传输)
- 在网络传输过程中解决加载图片过多,过大问题
- android 学习随笔七(网络:图片及文本传输及线程关系 )
- php将mysql中jpeg图片取出后直接缩小然后传给客户端,减轻网络传输负担
- Java 网络编程三 TCP传输协议(例:传输文本、图片)
- 小兵传奇三:scoket网络编程传输图片
- 小兵传奇三:scoket网络编程传输图片
- android 学习随笔七(网络:图片及文本传输及线程关系 )
- Android学习篇章45-HttpClient网络下载-IO流传输-下载图片资源
- 网络传输图片、声音等文件的方式
- 图片从数据流转换为字符型,方便网络传输 base64转换
- Handler消息传输机制(实例)—— 获取网络图片
- C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
- 使用volley实现简单的操作,json传输,网络图片显示
- C#.NET通过Socket实现平行主机之间网络通讯(含图片传输的Demo演示)
- Base64编码在网络图片传输中的应用实例