C++利用socket传输大文件的实现代码
作者:java 乐山
这篇文章主要为大家详细介绍了C/C++如何使用socket传输大文件的实现代码,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
server:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int fasong(void); int main(void){ FILE *f=fopen("/home/wzpc/c/1.mp4","r"); if(f==NULL){ puts("file error\n"); } long int n=0; while(!feof(f)){ //读写文件长度 fgetc(f); n++; } //------------------------------------------------- rewind(f); //文件指针返回文件起点 printf("%ld\n",n); int sp=fasong(); write(sp,&n,8); //传送总字节数 /* char c; fread(&c,1,1,f); for(int t=0;t<n;t++){ write(sp,&c,1); fread(&c,1,1,f); } //----------------------1.采用读文件一字节传送一字节,速度非常慢 */ char *pt=calloc(n,sizeof(char)); fread(pt,n,1,f); int ee=0; for(int k=0;(k*1024)<n;k++){ if(k*1024+1024>n){ //判断最后一次剩余字节数 ee=n-k*1024; }else{ ee=1024; } send(sp,&pt[k*1024],ee,0); } //-----------------------2. 采用块读取,每次1024字节,速度特快,因为socket每次传输有字节数限制,所有这理限定每次传输1024字节 fclose(f); close(sp); free(pt); return 0; } int fasong(void){ //socket 连接 struct sockaddr_in serv,*p; memset(&serv,0,sizeof(serv)); p=&serv; p->sin_family=AF_INET; p->sin_addr.s_addr=htonl(INADDR_ANY); p->sin_port=htons(3000); int sk=socket(PF_INET,SOCK_STREAM,0); if(sk==-1){ puts("socket error\n"); } if(bind(sk,(struct sockaddr*)&serv,sizeof(serv))==-1){ puts("bind error\n"); } if(listen(sk,10)==-1){ puts("listen error\n"); } puts("listening port\n"); int ck=accept(sk,NULL,NULL); if(ck==-1){ puts("accept error\n"); } //------------------------------------------------------- return ck; }
client
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int jisou(void); int main(void){ FILE *f1=fopen("/home/wzpc/c/2.mp4","w+"); if(f1==NULL){ puts("file error\n"); } long int len; int ss=jisou(); read(ss,&len,8); printf("%ld\n",len); /* char c; recv(ss,&c,1,0); for(int t=0;t<len;t++){ fwrite(&c,1,1,f1); recv(ss,&c,1,0); }*/ char *pt=calloc(len,sizeof(char)); int ee=0; for(int k=0;(k*1024)<len;k++){ if(k*1024+1024>len){ ee=len-k*1024; }else{ ee=1024; } recv(ss,&pt[1024*k],ee,0); } fwrite(pt,len,1,f1); close(ss); fclose(f1); free(pt); return 0; } int jisou(void){ int sock=socket(PF_INET,SOCK_STREAM,0); if(sock==-1) puts("socket() error"); struct sockaddr_in addr,*p; memset(&addr,0,sizeof(addr)); p=&addr; p->sin_family=AF_INET; p->sin_addr.s_addr=inet_addr("127.0.0.1"); p->sin_port=htons(3000); if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1) puts("connect() error"); return sock; }
c比java的socket传输快多了,肉眼可见的快。
特别注意,c中的数组长度是有限制的,如是大数组最好用动态分配内存。如malloc,calloc, 还有c中socket一次传输的字节数也是有限制的。最好选1024 2048 ,不要太大。
到此这篇关于C++利用socket传输大文件的实现代码的文章就介绍到这了,更多相关C++ socket传输大文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!