首页IT科技linux磁盘分区(Linux下基于C实现的socket简单文件下载实例 科技 紫苹果在线 快乐生活每一天)

linux磁盘分区(Linux下基于C实现的socket简单文件下载实例 科技 紫苹果在线 快乐生活每一天)

时间2025-06-20 16:02:30分类IT科技浏览5000
导读:Linux下基于C实现的socket简单文件下载实例...

Linux下基于C实现的socket简单文件下载实例

2012-07-11 11:08:58来源:评论:0 点击:4

此实例是客户端向服务器端下载文件:

服务器端代码实现:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include <fcntl.h>

#define FD_SERVER_PORT 8088 /*set port*/

#define FD_BUFFERSIZE 1024 /*set buffer size*/

#define FD_LISTENQ 10 /*set listen max conncent*/

int main(int argc,char *argv[])

{

int fd_listenfd,fd_connfd,fd_filefd; /*descriptor*/

int fd_read,fd_write;

int struct_size;

struct sockaddr_in fd_servaddr,fd_cliaddr;

char *fd_filename;

char *p;

char buffer[FD_BUFFERSIZE];

fd_listenfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/

if(fd_listenfd==-1){

perror("fd_socket");

exit(1);

}

memset(&fd_servaddr,0,sizeof(fd_servaddr)); /*servaddr set 0*/

fd_servaddr.sin_family=AF_INET; /*init serveraddr*/

fd_servaddr.sin_addr.s_addr=INADDR_ANY;

fd_servaddr.sin_port=htons(FD_SERVER_PORT);

/*bind fd_listenfd*/

if(-1==(bind(fd_listenfd,(struct sockaddr *)&fd_servaddr, sizeof(fd_servaddr)))){

perror("fd_bind");

exit(1);

}

/*listen fd_listenfd*/

if(-1==(listen(fd_listenfd,FD_LISTENQ))){

perror("fd_listen");

exit(1);

}

/*file download server start*/

while(1){

printf("file download server starting......\n");

memset(&fd_cliaddr,0,sizeof(fd_cliaddr));

struct_size=sizeof(fd_cliaddr);

fd_connfd=accept(fd_listenfd,(struct sockaddr *)&fd_cliaddr,&struct_size);

if(-1==fd_connfd){

perror("fd_accpet");

continue;

}

fd_filename="/root/tmp.txt";

printf("will download file name is:%s\n",fd_filename);

fd_filefd=open(fd_filename,O_RDONLY);

if(-1==fd_filefd){

perror("open will download file");

continue;

}

while(fd_read=read(fd_filefd,buffer,FD_BUFFERSIZE)){

if(-1==fd_read){

perror("read will download file");

break;

}

p=buffer;

while(fd_write=write(fd_connfd,p,fd_read)){

if(-1==fd_write){

perror("write client file");

break;

}

else if(fd_read==fd_write) break;

else if(fd_write>0){

p+=fd_write;

fd_read-=fd_write;

}

}

}

if(-1==fd_read||-1==fd_write) continue;

close(fd_filefd);

close(fd_connfd);

printf("file already is downloaded!\n");

}

close(fd_listenfd);

return 0;

}

客户端代码实现:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include <fcntl.h>

#define FD_SERVER_PORT 8088 /*set port*/

#define FD_BUFFERSIZE 1024 /*set buffer size*/

int main(int argc,char *argv[])

{

int fd_sockfd,fd_filefd; /*descriptor*/

int fd_read,fd_write;

int struct_size;

struct sockaddr_in fd_sockaddr;

char *fd_filename;

char *p;

char buffer[FD_BUFFERSIZE];

if (argc!=2) {

perror("fd_Usage: <./client> \n");

exit(1);

}

fd_sockfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/

if(fd_sockfd==-1){

perror("fd_socket");

exit(1);

}

memset(&fd_sockaddr,0,sizeof(fd_sockaddr)); /*servaddr set 0*/

fd_sockaddr.sin_family=AF_INET; /*init serveraddr*/

inet_aton(argv[1],&fd_sockaddr.sin_addr);

fd_sockaddr.sin_port=htons(FD_SERVER_PORT);

if(-1==(connect(fd_sockfd,(struct sockaddr *)&fd_sockaddr,sizeof(fd_sockaddr)))){

perror("fd_connect");

exit(1);

}

printf("start connecting..........\n");

fd_filename="./backup.txt";

fd_filefd=open(fd_filename,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);

if (-1==fd_filefd) {

perror("open the backup file");

exit(1);

}

while(fd_read=read(fd_sockfd,buffer,FD_BUFFERSIZE)) {

if(-1==fd_read){

perror("read server file");

exit(1);

}

/*p is used to wirte error*/

p=buffer;

while(fd_write=write(fd_filefd,p,fd_read)){

if(-1==fd_write){

perror("write localhost file");

exit(1);

}

else if(fd_read==fd_write) break;

else if(fd_write>0){

p+=fd_write;

fd_read-=fd_write;

}

}

}

close(fd_filefd);

close(fd_sockfd);

printf("finsh file download!\n");

return 0;

}

声明:本站所有文章            ,如无特殊说明或标注                  ,均为本站原创发布            。任何个人或组织      ,在未征得本站同意时      ,禁止复制            、盗用                  、采集      、发布本站内容到任何网站            、书籍等各类媒体平台                  。如若本站内容侵犯了原著者的合法权益                  ,可联系我们进行处理      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
数据采集系统app(数据采集软件-采集实时数据软件)