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 ,不要太大。