该程序在linux下面运行
分别写了服务器端与客户端以下是代码:
server.c
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define SA struct sockaddr
#define BUFFER_SIZE 1024
#define LISTEN 5
char * namercve(int fd ,char * name)
{
int bytes_recv;
bytes_recv=read(fd,name,sizeof(name));
if(bytes_recv<=0)
return NULL;
name[bytes_recv]='/0';
return name;
}
int main(int argc,char **argv)
{
int from_fd,to_fd;
char buffer[BUFFER_SIZE];
char name[50];
int bytes_read,bytes_write;
char *ptr;
struct sockaddr_in servaddr,cliaddr;
int listenfd;
socklen_t len;
/* if(argc!=3)
{
printf("Usage: %s from file to file /n/a",argv[0]);
exit(1);
}*/
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
printf("%s/n",strerror(errno));
exit(0);
}
printf("get socket descriptor success!/n");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5566);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd,(SA *) &servaddr,sizeof(servaddr))==0)
printf("bind success!/n");
if(listen(listenfd,LISTEN)==0)
printf("begin listenning:/n");
for(;;){
len = sizeof(cliaddr);
to_fd = accept(listenfd,(SA *) &cliaddr,&len);
printf("client锛?s/n",inet_ntoa(cliaddr.sin_addr));
if(!namercve(to_fd,name))
exit(0);
/*open the source file*/
if((from_fd=open(name,O_RDONLY))==-1)
{
printf("Open %s Error : %s /n",argv[1],strerror(errno));
exit(1);
}
/*create dirction file*/
/*if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
printf("Open %s Error: %s/n",argv[2],strerror(errno));
exit(1);
}
*/
/*the following is a classic file-copying code.*/
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/*A critical mistake occures*/
if((bytes_read==-1)&&(errno!=EINTR)) break;
/*All bits have been writen down.*/
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
if((bytes_write==-1)&&(errno!=EINTR)) break;
else if (bytes_write==bytes_read) break;
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1) break;
}
}
close(from_fd);
close(to_fd);
}
exit(0);
}
client.c
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#define BUFFER_SIZE 1024
int namesend(int fd,char *name)
{
int bytes_write;
bytes_write=write(fd,name,sizeof(name));
if(bytes_write<=0)
return 0;
return 1;
}
int main(int argc,char **argv)
{
int from_fd,to_fd;
//int sockfd;
struct sockaddr_in servaddr;
char buffer[BUFFER_SIZE];
int bytes_read,bytes_write;
char *ptr;
if(argc!=3)
{
printf("Usage: %s from file to file /n/a",argv[0]);
exit(1);
}
if((from_fd=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket:");
exit(errno);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi("5566"));
if(inet_aton("localhost",&servaddr.sin_addr)<0)
{
perror("inet_aton:");
exit(errno);
}
if(connect(from_fd,(struct sockaddr *) &servaddr,sizeof(servaddr))<0)
{
perror("connect:");
exit(errno);
}
/*open the source file*/
/*if((from_fd=open(argv[1],O_RDONLY))==-1)
{
printf("Open %s Error : %s /n",argv[1],strerror(errno));
exit(1);
}
*/
/*create dirction file*/
if(namesend(from_fd,argv[1])==0)
exit(0);
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{
printf("Open %s Error: %s/n",argv[2],strerror(errno));
exit(1);
}
/*the following is a classic file-copying code.*/
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))
{
/*A critical mistake occures*/
if((bytes_read==-1)&&(errno!=EINTR)) break;
/*All bits have been writen down.*/
else if(bytes_read>0)
{
ptr=buffer;
while(bytes_write=write(to_fd,ptr,bytes_read))
{
if((bytes_write==-1)&&(errno!=EINTR)) break;
else if (bytes_write==bytes_read) break;
else if(bytes_write>0)
{
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1) break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
以上是源代码。用法下次在说。