//文件名不能超过30个字符长度
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVERPORT 5555 //服务器端口
#define MAXACCEPT 5 //最大接受的连接数
void main(int argc,char **argv)
{
char file[30]; //要发送的文件不能超过30个字符
char c;
char buffer[1024]; //每次发送的缓存
int source; //用来判断文件是否存在
int k; //传送文件时,实际从文件中读到的字节数
int sockfd;//原始套接字
int newsock;//接收到客户端请求后新建的套接字
struct sockaddr_in server_addr,client_addr;
int sin_size;//sockaddr_in所占字节数
//判断输入的参数的数目是否够
bzero(file,30);
if(argc!=2)
{printf("/t参数输入错误/n /t例如:#./server /mnt/test/server.c/n");
exit(1);
}
strcpy(file,argv[1]);
//判断要传送的文件是否能打开
if((source=open(file,O_RDONLY))<0)
{perror("源文件打开错误");
exit(1);
}
//创建套接字等待客户端的连接
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{perror("sock:");
exit(1);
}
//填写服务器信息
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(SERVERPORT);
//绑定sockfd描述符
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))<0)
{perror("bind:");
exit(1);
}
//监听sockfd描述符
if(listen(sockfd,MAXACCEPT)<0)
{perror("listen:");
exit(1);
}
while(1)
{
//服务器阻塞,直到客户端连接
sin_size=sizeof(struct sockaddr_in);
if((newsock=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))<0)
{perror("accept error:");
exit(1);
}
//客户端连接以后,传送文件名
if(write(newsock,file,30)<0)
{perror("write error:");
exit(1);
}
//传送文件
while((k=read(source,buffer,sizeof(1024)))>0)
write(newsock,buffer,k);
printf("/n/n/t发送完毕/n");
close(source);
close(newsock);
//printf("server get connect from %s/n",inet_ntoa(client_addr.sin_addr));
}
}
Linux下通过TCP传送文件(服务器端)
最新推荐文章于 2024-07-31 09:28:08 发布