fileserver.c

来自「linux下的服务器端大文件传输程序」· C语言 代码 · 共 84 行

C
84
字号
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define BACKLOG 10
#define MAXNAME 10
#define MAXLEN 100
int main (int argc,char* arvg[])
{
    int connfd,sockfd;
    struct sockaddr_in servaddr;
    struct sockaddr_in tempaddr;
    struct sockaddr_in cliaddr;
    int clilen;
    char ip_str[INET_ADDRSTRLEN];
    int templen;
    char name[MAXNAME]={0}, buffer[MAXLEN];
	FILE *fp;
	int n;
	/*creat a IPv4 TCP socket*/
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
    {
        perror("socket");
       // exit(1);
    }
    /*initialize the sockaddr_in*/
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    /*We let the kernel choose our port number*/
    servaddr.sin_port=0;
    /*ok,now bind*/
    if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))==-1)
    {
        perror("bind");
       // exit(1);
    }
    /*listen on the port*/
    if(listen(sockfd,BACKLOG)==-1)
    {
        perror("listen");
       // exit(1);
    }
    /*how can we get the binded socket information*/
    templen=sizeof(struct sockaddr);
    if(getsockname(sockfd,(struct sockaddr*)&tempaddr,&templen)==-1)
    {
    perror("getsockname");
   // exit(1);
    }
    printf("Server is listening on port %d\n",ntohs(tempaddr.sin_port));
    for(;;)
    {
        clilen=sizeof(cliaddr);
        connfd=accept(sockfd,(struct sockaddr*)&cliaddr,&clilen);

        if(connfd==-1)
        {
            perror("accept");
            continue;
        }
        printf("Server:client %s connects \n",inet_ntoa(cliaddr.sin_addr));
        read(connfd,name,MAXNAME);
		printf("Client requests file:%s", name);
		if((fp=fopen(name,"r"))==NULL)
		{
			fprintf(stdout,"Can't open \"%s\" file.\n",name);
           // exit(1);
		}
		while(n=fread(buffer,sizeof(char),MAXLEN,fp))
			write(connfd,buffer,n);

		printf("\nServer sent file over!\n");
		fclose(fp);
		close(connfd);
    }

    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?