Linux------Small Network disk (1)

Source: Internet
Author: User
Tags htons

  

One: Requirements

Using a Linux socket for file transfer, this time only supports the client side to upload files to the sever side

Two: Implementation tips:

Client.c

There are two parameters for the client, namely the server hostname and port;

Enter the name of the file you want to transfer in the while loop, and then set up a socket to connect to the server via the server hostname and port;

Open the file, read the file in the while loop, send the file

Sever.c

Accept the client's connection in the while loop, accepting the data and writing it to the file

(You can also select a connection from the Select () Accept client to receive data in a while loop and write to the file)

Three: Procedure

SEVER.C (server side)

  

#include <stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/inch.h>#include<sys/types.h>#include<unistd.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#definePORT 5168#defineMsglen 1024intMainintargcChar**argv) {    intSeverfd, CLIENTFD; intFp,flags;    Socklen_t Addrlen; structsockaddr_in severaddr, clientaddr; CharRecvbuff[msglen]; Charfilename[ -]; intRecv_len; if(SEVERFD = socket (af_inet, Sock_stream,0)) == -1) {perror ("Sockst () error"); Exit (-1); } severaddr.sin_family=af_inet; Severaddr.sin_port=htons (PORT); SeverAddr.sin_addr.s_addr=htons (Inaddr_any); Bzero (&severaddr.sin_zero,8); if(Bind (SEVERFD, (structsockaddr*) &severaddr,sizeof(structSOCKADDR)) = =-1) {perror ("bind () error"); Exit (-1); }    if(Listen (SEVERFD,1) == -1) {perror ("Listen () Error"); Exit (-1); } Addrlen=sizeof(structsockaddr);  while(1) {Flags=0; if(Clientfd = Accept (SEVERFD, (structsockaddr*) &clientaddr, &addrlen)) = =-1) {perror ("Accept () error"); Exit (-1); } printf ("recv file Fome ip:%s port:%d\n", Inet_ntoa (CLIENTADDR.SIN_ADDR), Ntohs (Clientaddr.sin_port)); if(recv (CLIENTFD, filename, strlen (filename),0) <0) {perror ("recv filename Error");  Break;// Less} FP= open (filename, O_RDWR | O_creat,777);  while(Recv_len = recv (Clientfd, Recvbuff, Msglen,0)) >0) {Flags++; if(Flags = =1) {printf ("recv file Start"); }            Else{printf ("."); }            if(Write (FP, Recvbuff, Recv_len)) {bzero (&Recvbuff, Msglen); }Else{perror ("write () error");  Break; }        }         if(Flags = =0) perror ("recv () error"); if(Flags >0) {printf ("\nrecv success\n");        Close (CLIENTFD);    }} close (SEVERFD); return 0;}

CLIENT.C (client)

  

#include <stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include<netinet/inch.h>#include<sys/types.h>#include<unistd.h>#include<netdb.h>#include<sys/stat.h>#include<fcntl.h>#defineMsglen 1024structADDR {intPort; Charname[ +];};voidFile_send (structADDR ADDR,Char*filename) {    intSOCKFD; FILE*FP; structsockaddr_in sevraddr; structHostent *host; CharReadbuff[msglen]; intLen; Host=gethostbyname (addr.name); if(SOCKFD = socket (af_inet, Sock_stream,0)) == -1) {perror ("socket () error"); Exit (-1); }Elseprintf ("Socket ok\n"); Sevraddr.sin_family=af_inet; Sevraddr.sin_port=htons (Addr.port); Sevraddr.sin_addr= *((structin_addr*) host->h_addr); Bzero (&sevraddr.sin_zero,8);//printf ("ok2\n");    if(Connect (SOCKFD,structsockaddr*) &sevraddr,sizeof(structSOCKADDR)) = =-1) {perror ("Connect () Error"); Exit (-1); }Elseprintf ("Connect ok\n");//fp = open (filename, o_rdonly);    if(Send (SOCKFD, filename,sizeof(filename),0) <0) {perror ("Send filename Error"); Exit (-1); } FP= fopen (filename,"RB"); if(FP! =NULL) {printf ("Send File");  while(1) {            if(len = fread (Readbuff,1, Msglen, FP)) >0) {                if(Send (SOCKFD, Readbuff, Len,0) <0) {perror ("Send () error"); Exit (-1); } Else{printf ("."); Bzero (&Readbuff, Msglen); }                            } Else if(len = =0){//equals 0 means the file has reached the end//Send (SOCKFD, Readbuff, strlen (Readbuff), 0);printf"\nfile Send success\n");  Break; } Else{perror ("read () Error"); Exit (-1); }        }    }Else{printf ("Open File failed\n"); Exit (-1);    } fclose (FP); Close (SOCKFD);}intMainintargcChar**argv) {    structADDR useraddr; Charfilename[ -]; if(ARGC! =3) {printf ("Usage:./client [hostname] [port]"); Exit (-1); } strcpy (Useraddr.name, argv[1]); Useraddr.port= Atoi (argv[2]);  while(1) {printf ("Please input filename of want send\n"); Fgets (filename, -, stdin); Filename[strlen (filename)-1] =0;//printf ("ok1\n");file_send (useraddr, filename); }    return 0;}


Four: Phenomenon

(Has been experimented, running correctly)

Linux------Small Network disk (1)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.