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