?? server.c
字號:
//文件名不能超過30個字符長度
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <error.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <netinet/in.h>
#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));
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -